【发布时间】:2016-08-19 04:31:02
【问题描述】:
我使用 ajax 和 jQuery,我们知道 $.ajax 返回一个承诺 ajaxPromise。我的要求是:只有当所有ajax调用重试都失败时,ajaxPromise才捕获失败(我想在ajax promise回调函数中处理错误)。
我尝试了以下代码:
function ajax(data) {
return $.ajax({
url: "...",
data: data,
triedCount: 0,
retryLimit: 3,
error: function(xhr, textStatus, errorThrown ) {
console.log("error: " + this.triedCount);
this.triedCount++;
if (this.triedCount < this.retryLimit) {
$.ajax(this);
}
}
});
}
var ajaxPromise = ajax({"id": "123"});
ajaxPromise.fail(function(xhr) {
console.log("All retries failed...");
// all retries failed, handle error
});
输出我想要的是:
error: 0
error: 1
error: 2
All retries failed...
虽然实际上输出是:
error: 0
All retries failed...
error: 1
error: 2
看起来fail回调在第一次调用失败后立即触发,而我希望在所有重试失败后触发fail回调。
有没有什么办法只有在所有重试失败时才触发ajaxPromise.fail回调?还是有其他选择可以做到这一点?
【问题讨论】:
-
你知道 javascript 的作用域有多扭曲吗?我不确定,但我相信嵌套的 ajax 调用,你的
triedCount变量丢失了。也许尝试在回调中传递变量,然后作为选项在 ajax 调用中传递? -
你提前知道返回的是哪个标头吗?如果是,您可以使用 statuCode 回调。
-
@MridulKashyap
triedCount变量没有范围问题:) -
@coderz:我建议你将所有的
promises(包括重试承诺)的ajax调用推到一个数组中 -
为什么不尝试使用 async : false
标签: javascript jquery ajax