【问题标题】:jQuery Deferred - waiting for multiple AJAX requests to finish [duplicate]jQuery Deferred - 等待多个 AJAX 请求完成 [重复]
【发布时间】: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();
};

【问题讨论】:

标签: jquery jquery-deferred


【解决方案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 的正常上下文?
  • 这有助于澄清上面的答案:stackoverflow.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');
});

非常有用。

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2014-02-19
    • 2013-03-27
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多