我有两个ajax调用,即
var ajax1 = $.ajax({ url: Url1 });
var ajax2 = $.ajax({ url: Url2 });
$.when(ajax1, ajax2).then(function (response1, response2) {
});
我们希望有条件地处理这些API延迟请求的失败案例:
WinAjax1_WinAjax2();
WinAjax1_LoseAjax2();
LoseAjax1_WinAjax2();
LoseAjax1_LoseAjax2();
如果我将逻辑放在相应ajax的.fail
中,我就不知道其他ajax的响应是什么。如果我将.fail
置于.when
的失败状态,我无法确定它是哪个失败。
有人可以帮助我在完成所有请求后如何确定哪个ajax失败了多个ajax请求?
答案 0 :(得分:1)
jQuery延迟对象有一个state method。因此,您可以使用$.when
并在失败时检查每个延迟对象的状态。
var d1 = jQuery.Deferred();
var d2 = jQuery.Deferred();
$.when(d1, d2).then(function(v1, v2) {
// do something on succes
}).fail(function() {
console.log(d1.state()); // resolved
console.log(d2.state()); // rejected
});
d1.resolve( "Fish" );
d2.reject( "Pizza fail" );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
编辑:似乎我错过了你的主要目标。如果您需要等到所有请求都完成(已解决或拒绝)。然后$.when
对此无效,因为一旦请求被拒绝而不等待其他请求,它将被拒绝。
在这种情况下,我建议您在完成所有请求时进行计数。然后检查他们的状态。
var d1 = jQuery.Deferred();
var d2 = jQuery.Deferred();
var activeRequests = 2;
function onComplete() {
activeRequests--;
if (!activeRequests) {
// check deferred object states here
console.log(d1.state());
console.log(d2.state());
}
}
d1.always(onComplete);
d2.always(onComplete);
d2.reject( "Pizza fail" );
d1.resolve( "Fish" );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 1 :(得分:1)
答案与提到的解决方案here完全相同。
var d1 = $.Deferred();
var d2 = $.Deferred();
var j1 = $.getJSON(...).complete(d1.resolve);
var j2 = $.getJSON(...).complete(d2.resolve);
$.when(d1,d2).done(function() {
// will fire when j1 AND j2 are both resolved OR rejected
// check j1.isResolved() and j2.isResolved() to find which failed
});
答案 2 :(得分:0)
你可以在ajax调用之后显式调用一个函数,它会检查所有ajax调用是否成功。例如:
var ajax1_success = false,
ajax1_called = false,
ajax2_success = false,
ajax2_called = false;
var afterAjax = function () {
if (!(ajax1_called && ajax2_called)) {
return;
}
// add conditionals here
};
var ajax1 = $.ajax({ url: Url1 })
.success(function() {
ajax1_success = true;
}).always(function() {
ajax1_called = true;
afterAjax();
});
var ajax2 = $.ajax({ url: Url2 })
.success(function() {
ajax2_success = true;
}).always(function() {
ajax2_called = true;
afterAjax();
});