jQuery延迟-等待多个AJAX请求完成

jQuery延迟-等待多个AJAX请求完成,jquery,jquery-deferred,Jquery,Jquery Deferred,我有一个三层的延迟ajax调用的深层链,理想情况下,当最深层调用完成时,它们将一路履行承诺(让我成为《盗梦空间》……“我们需要更深入一些!”) 问题是我一次发送了许多ajax请求(可能有数百个),需要推迟到所有请求都完成之后。我不能指望最后一件事是最后一件 function updateAllNotes() { return $.Deferred(function(dfd_uan) { getcount = 0; getreturn = 0;

我有一个三层的延迟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();
};
函数updatealnotes(){
返回延迟的美元(函数(dfd){
getcount=0;
getreturn=0;
对于(i=0;i您可以将
.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
    });
}
函数updatealnotes(){
var getarray=[],
i、 len;
对于(i=0,len=data.length;i
感谢Brittohaloran的回答。我还使用了下划线,因此我能够非常清晰地将您的解决方案应用于map,有点像这样:

$.when.apply($, _.map(data, function(i) {
    return getNote(i.key);
})).done(function() {
    alert('Be Happy');
});
非常有用。

如果您参考doc,如果您的一个ajax调用失败,即使后续所有ajax调用尚未完成,也会调用主回调。
fail

如果要等待所有呼叫,无论结果如何,都必须使用另一个延迟呼叫,如下所示:

$.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();
});

您也可以接受自己的答案。通过这样做,您可以帮助面临类似问题的其他人,因为他们将在搜索结果中看到此问题已得到解决。:)是否有任何理由指定
$
作为第一个要应用的参数?我知道这是调用的上下文,但不是jQuery调用
窗口的正常上下文,甚至可能不是
null
?这有助于澄清上面的答案:我认为它一点也没有帮助。是的,如果使用相同的co以我为例,包装你的承诺。以我为例,它工作得非常完美。在你的链接中,你只是做了与Brittohaloran相同的事情,两个承诺没有包装。在这种情况下,如果第一个承诺失败,即使下一个承诺没有完成,也会调用fail/always回调。