jQuery延期 – 等待多个AJAX请求完成

我有一个三层延期的Ajax调用链,最理想的情况是,当最深层完成时,他们会一直向前发起承诺(使我成为Inception的东西……“我们需要更深入!”)。

问题是,我一次发送了很多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(); }; 

您可以使用.apply().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.When 。当doc,如果你的ajax调用失败了,即使所有的ajax调用还没有完成, fail mastercallback也会被调用。 在这种情况下,您不能确定所有通话都已完成。

如果你想等所有的电话,不pipe结果是什么,你必须使用另一个延期像这样:

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

谢谢你的答案brittohalloran。 我也在使用Underscore,所以我可以非常干净地用地图来应用你的解决scheme,就像这样:

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

邪恶有用。