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 请求完成 [重复]的主要内容,如果未能解决你的问题,请参考以下文章