jQuery Deferred - 等待多个 AJAX 请求完成 [重复]

Posted

技术标签:

【中文标题】jQuery Deferred - 等待多个 AJAX 请求完成 [重复]【英文标题】:jQuery Deferred - waiting for multiple AJAX requests to finish [duplicate] 【发布时间】:2011-09-26 04:16:45 【问题描述】:

我有一个三层深层的延迟 ajax 调用链,理想情况下,当最深层完成时,它们会一直执行承诺(让我想起了《盗梦空间》……“我们需要更深入!” )。

问题是我一次发送了许多 ajax 请求(可能数百个)并且需要推迟到所有请求都完成。我不能指望最后一个在最后完成。

function updateAllNotes() 
    return $.Deferred(function(dfd_uan) 
        getcount = 0;
        getreturn = 0;
        for (i = 0; i <= index.data.length - 1; i++) 
            getcount++;
            $.when(getNote(index.data[i].key)).done(function() 
                // getNote is another deferred
                getreturn++
            );
        ;
        // need help here
        // when getreturn == getcount, dfd_uan.resolve()
    ).promise();
;

【问题讨论】:

***.com/questions/3709597/… 【参考方案1】:

您可以将.when().apply() 与多个延迟一起使用。非常有用:

function updateAllNotes() 
    var getarray = [],
        i, len;

    for (i = 0, len = data.length; i < len; i += 1) 
        getarray.push(getNote(data[i].key));
    ;

    $.when.apply($, getarray).done(function() 
        // do things that need to wait until ALL gets are done
    );

【讨论】:

您也可以接受您自己的答案。通过这样做,您可以帮助面临类似问题的其他人,因为他们会在搜索结果中看到此问题已得到解决。 :) 是否有任何理由将$ 指定为应用的第一个参数?我知道这是调用的上下文,但不是 jQuery 调用window 甚至null 的正常上下文? 这有助于澄清上面的答案:***.com/questions/14777031/…【参考方案2】:

如果您参考jQuery.When doc,如果您的ajax 调用之一失败,即使所有后续ajax 调用尚未完成,fail 主回调也会被调用。在这种情况下,您不确定您的所有呼叫是否都已完成。

如果你想等待所有的调用,无论结果如何,你都必须像这样使用另一个 Deferred :

$.when.apply($, $.map(data, function(i) 
    var dfd = $.Deferred();
    // you can add .done and .fail if you want to keep track of each results individualy
    getNote(i.key).always(function()  dfd.resolve(); );
    return dfd.promise();
);

【讨论】:

我不认为总是有帮助,因为它still runs before the promises are fulfilled。 是的,如果您使用与我相同的代码并包装您的承诺,它会有所帮助。 I've updated your fiddle 以我为例,效果很好。在您的链接中,您只是做了与 brittohalloran 相同的操作,两个未包装的承诺。在这种情况下,如果第一个失败,即使下一个 promise 没有完成,也会调用 fail/always 回调。【参考方案3】:

感谢 brittohalloran 的回答。我也在使用下划线,所以我能够非常干净地使用地图应用您的解决方案,有点像这样:

$.when.apply($, _.map(data, function(i) 
    return getNote(i.key);
)).done(function() 
    alert('Be Happy');
);

非常有用。

【讨论】:

以上是关于jQuery Deferred - 等待多个 AJAX 请求完成 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

jQuery之Deferred对象详解

jQuery Deferred:具有多个对象的 $.when()

jQuery之Deferred对象P2

jQuery Deferred 应该可以工作,但不能

Deferred

jQuery异步框架探究1:jQuery._Deferred方法