我已经查看过许多类似的问题,但建议的解决方案并不能按预期在所有情况下使用。当所有ajax调用成功完成但以下任何ajax调用失败时,以下代码工作正常,则立即调用onComplete
:
var deferredArray = $('.preload').map(function() {
return $.get(this.href)
});
$.when.apply($, deferredArray).then(onComplete, onComplete);
所以可能有两种情况:
onComplete
- 工作正常; onComplete
而不等待其他延期调用。第二种情况代表我的问题。在调用onComplete
之前,无论状态如何,都应始终等待所有呼叫完成。
我使用jQuery 1.7.1,因为它内置于框架中。如果问题是由版本引起的,我可以升级,但我更喜欢保留当前版本。
答案 0 :(得分:2)
您可以尝试ajaxStop()
。绝不是最优雅的解决方案。
$( document ).ajaxStop(function() {
// do some stuff now that all the ajax stuff has stopped
})
另请注意:
如果在全局选项设置为false的情况下调用$.ajax()
或$.ajaxSetup()
,则.ajaxStop()
方法将不会触发。
答案 1 :(得分:2)
我不确定这是否超出了您正在寻找的解决方案类型的范围,但我最近利用bluebird.js来包装我的所有jquery ajax电话。
例如:
var aPass = function(){
return Promise.resolve($.get("/echo/json/"))
};
var aFail = function(){
return Promise.resolve($.get("/echo/jsonFake/")) // this will fail
};
var allPass = [aPass(), aPass(), aPass()];
var oneFails = [aPass(), aPass(), aFail()];
Promise.all(allPass).spread(function(a,b,c){
console.log("All Done!");
}).catch(function(){
console.log("NEVER FAILS!");
});;
Promise.all(oneFails).spread(function(a,b,c){
console.log("never goes in here");
}).catch(function(){
console.log("FAILED");
});
这允许我做的是然后执行Promise.all,然后等待所有ajax调用完成。每个单独的承诺都可以通过或失败,但是.then(或.spread)只有在它们全部成功时才会被调用。
dropdown
这是一个证明这一点的jsfiddle:http://jsfiddle.net/ys598t4s/2/