Javascript 如何将Ajax处理移动到函数?
我有以下代码:Javascript 如何将Ajax处理移动到函数?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有以下代码: function submitHandler($link, $modal, close) { var $form = $modal.find('#main-form'); var $submitBt = $modal.find('.block-footer button:contains("Submit")'); var oSubmit = { $form: $form, $modal: $modal,
function submitHandler($link, $modal, close) {
var $form = $modal.find('#main-form');
var $submitBt = $modal.find('.block-footer button:contains("Submit")');
var oSubmit = {
$form: $form,
$modal: $modal,
action: $form.attr('data-action'),
entity: $form.attr('data-entity'),
href: $form.attr('data-href'),
row: $link.attr('data-row'),
$row: $('#row_' + $link.attr('data-row')),
$submitBt: $submitBt
};
if (!$form.valid || $form.valid()) {
$submitBt.disableBt();
$modal.removeBlockMessages()
.blockMessage('Contacting Server, please wait ... ', { type: 'loading' });
$.ajax({
url: oSubmit.href,
dataType: 'json',
type: 'POST',
data: $form.serializeArray()
})
.done(function (json, textStatus, XMLHttpRequest) {
json = json || {};
if (json.success) {
submitSuccessModal(oSubmit, json);
if (close == true) {
$modal.closeModal();
if (oSubmit.action == "Create") {
$('#createLink').prop('disabled', false);
}
}
} else {
submitFailModal(oSubmit, json);
}
})
.fail(function (XMLHttpRequest, textStatus, errorThrown) {
setTimeout(function () {
$modal
.removeBlockMessages()
.blockMessage('Could not contact server, please try again', { type: 'error' });
$submitBt.enableBt();
}, 1000);
return false;
});
};
};
将该功能从my$.ajax中移出,并移入一个表示“完成”的函数和另一个表示“失败”的函数的最佳方法是什么。我还应该向这些函数传递哪些参数?我想我最困惑的是我应该如何处理我在代码顶部声明的变量。我是否应该像中那样将这些函数传递给外部函数。完成后,我确实引用了其中的一些函数。您现在必须使用的是所谓的匿名函数。将对匿名函数(没有名称的函数)的引用传递到
done
和fail
函数中
也许为了更好地组织代码(或使这些函数与其他代码共享),您只需给这些函数起一个名称,并将它们移到ajax()
调用之外。我们将把它们称为onDone
和onFail
,当然你可以随便叫它们
请注意,我引用它们时不使用并列关系,因为我指的是函数对象本身,而不是被调用函数的返回值
function onDone(json, textStatus, XMLHttpRequest) {
json = json || {};
if (json.success) {
submitSuccessModal(oSubmit, json);
if (close == true) {
$modal.closeModal();
if (oSubmit.action == "Create") {
$('#createLink').prop('disabled', false);
}
}
} else {
submitFailModal(oSubmit, json);
}
}
function onFail(XMLHttpRequest, textStatus, errorThrown) {
setTimeout(function () {
$modal
.removeBlockMessages()
.blockMessage('Could not contact server, please try again', { type: 'error' });
$submitBt.enableBt();
}, 1000);
return false;
}
$.ajax({
url: oSubmit.href,
dataType: 'json',
type: 'POST',
data: $form.serializeArray()
})
.done(onDone) //Reference to onDone, without parenthesis
.fail(onFail);
由于done()
和fail()
已经将匿名函数作为参数,您只需在别处声明这些函数,然后按名称引用它们:
var doneFunction = function (json, textStatus, XMLHttpRequest) {
...
};
var failFunction = function (XMLHttpRequest, textStatus, errorThrown) {
...
};
$.ajax({
url: oSubmit.href,
dataType: 'json',
type: 'POST',
data: $form.serializeArray()
})
.done(doneFunction)
.fail(failFunction);
这个怎么样:
var ajax_functions = {};
ajax_functions.success = function(json, textStatus, XMLHttpRequest) {
// code
};
ajax_functions.error = function(XMLHttpRequest, textStatus, errorThrown) {
// code
};
$.ajax({
url: oSubmit.href,
dataType: 'json',
type: 'POST',
data: $form.serializeArray(),
success: ajax_functions.success,
error: ajax_functions.error
});
谢谢我有个问题。参数是否通过just.done(onDone)传递?此外,我还更新了我的问题,以包括创建答案时的所有代码。我还有一些其他东西需要传递给.onDone,比如变量oSubmit。你认为我应该让这个全球化吗?我是否可以为对话框内容创建一个名称空间,并使其成为全局名称空间,还是应该以某种方式传递给onDone()?您正在调用
.done()
函数并传递对onDone
函数对象的引用。无论最终调用这个函数的是什么,都将决定传入哪些参数。因此,传递给该函数的参数不是您在此控制的。我认为您为所需数据创建本地作用域的做法是正确的,这样您就可以在onDone
函数中访问它。如果您想在onDone
函数中访问oSubmit
的值,只需将该函数放在相同的作用域中(在您的例子中,就是submitHandler
函数)。即使在调用onDone
时函数已经退出,该值仍将通过闭包的魔力得以保留。很抱歉问这个问题。但我能把函数放在函数中吗?如果是这样的话,那么你所说的范围听起来不错。谢谢,当然!做这样的事情也很常见:var-onDone=function(json,textStatus,XMLHttpRequest){…}如果你觉得嵌套函数看起来有点奇怪,我更新了我的问题,但你很快就回答了。如何将oSubmit这样的变量传递给ajax doneFunction?