等到所有jQuery ajax调用完成(完成或拒绝)

时间:2015-06-15 20:16:32

标签: javascript jquery ajax wait

我已经查看过许多类似的问题,但建议的解决方案并不能按预期在所有情况下使用。当所有ajax调用成功完成但以下任何ajax调用失败时,以下代码工作正常,则立即调用onComplete

var deferredArray = $('.preload').map(function() {
    return $.get(this.href)
});
$.when.apply($, deferredArray).then(onComplete, onComplete);

所以可能有两种情况:

  • 所有延期通话都成功,之后调用onComplete - 工作正常;
  • 某些延迟调用失败(返回HTTP 400错误请求),然后立即调用onComplete而不等待其他延期调用。

第二种情况代表我的问题。在调用onComplete之前,无论状态如何,都应始终等待所有呼叫完成。

我使用jQuery 1.7.1,因为它内置于框架中。如果问题是由版本引起的,我可以升级,但我更喜欢保留当前版本。

2 个答案:

答案 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/