我有这个常见的JavaScript函数来处理我的ASP.NET Web表单应用程序的所有Ajax请求:
var xsrf_token, IsAjaxAsync = true;
function callAjax(Handler, ajaxData, Cache, BeforeSend, Complete, Reset) {
var URL = "http://" + window.location.host + "/Handlers/" + Handler + ".ashx";
$.retryAjax({
url: URL,
type: "POST",
timeout: 5000,
retryLimit: 3,
data: JSON.stringify({
XSRFToken: xsrf_token,
Data: ajaxData
}),
dataType: "json",
cache: Cache,
async: IsAjaxAsync,
beforeSend: BeforeSend,
success: function (data) {
var resp = parseInt(data);
if (resp != -10) {
Complete(data);
} else {
$.prompt("Please login to perform this operation.", {
title: "Logged Out",
close: function () {
window.location.href = "http://" + window.location.host + "/Login";
}
});
}
},
complete: function () {
UpdateHistory();
},
error: function (jqXHR, textstatus, error) {
if (textstatus == 0) showConnectionError();
if (Reset != null) Reset();
}
});
}
此函数实际上是使用此插件调用ajax:https://github.com/mberkom/jQuery.retryAjax
但似乎这个函数无法调用我希望在每种情况下调用的complete
回调。是否发生错误,或请求是否成功,或者即使success
回调返回false或其他错误。
我试图在第31行添加断点,但它没有到达那里。请告诉我如何在每种情况下调用此UpdateHistory()
?我不希望在使用此callAjax()
函数的每个函数中调用它。
我想问的另一件事是,如果success
陷入某种无限循环或某些长期过程,那么仍然会调用complete
吗?什么是跳过complete
的各种情况?
答案 0 :(得分:1)
正如您在retryAjax source的第21行所示,您的完整回调被覆盖,因为这是一个非常简单的插件,我建议您通过应用以下内容更改插件代码以满足您自己的需求改变:
ajaxParams.complete = function (jqXHR, textStatus) {
if ($.inArray(textStatus, ['timeout', 'abort', 'error']) > -1) {
this.tryCount++;
if (this.tryCount <= this.retryLimit) {
// fire error handling on the last try
if (this.tryCount === this.retryLimit) {
this.error = errorCallback;
delete this.suppressErrors;
}
//try again
$.ajax(this);
return true;
}
//window.alert('There was a server error. Please refresh the page. If the issue persists, give us a call. Thanks!');
ajaxParams.myCompleteCallback(jqXHR, textStatus);
}
ajaxParams.myCompleteCallback(jqXHR, textStatus);
};
然后,不要传递一个名为complete的完整回调,而只是传递一个名为myCompleteCallback的完整回调