2011-06-30 65 views
47

我有一个三层深的延期ajax调用链,理想情况下,他们将在最深层完成时启动承诺(使我成为Inception的东西。 ..“我们需要更深入!”)。jQuery延期 - 等待多个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(); 
}; 
+1

http://stackoverflow.com/questions/3709597/wait-until -all-jquery-ajax-request-are-done/9350515#9350515 – Benjamin

回答

95

您可以使用.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 
    }); 
} 
+8

你也可以_accept_你自己的答案。通过这样做,您可以帮助其他面临类似问题的人,因为他们会发现这个问题已经在他们的搜索结果中得到解决。 :) – Exa

+0

谢谢。标记为已接受 – brittohalloran

+0

是否有任何理由指定'$'作为第一个参数来应用?我知道这是调用的上下文,但不是jQuery调用“window”或甚至“null”的正常上下文吗? – Ryley

5

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

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

妖兽有用。

25

如果您参考jQuery.When文档,如果您的某个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(); 
}); 
+0

我不认为总是有所帮助,因为它[仍然运行之前承诺履行](http://jsfiddle.net/katowulf/J7H6M/)。 – Kato

+2

是的,如果你使用和我一样的代码并包装你的承诺,它会有所帮助。 [我更新了你的小提琴](http://jsfiddle.net/J7H6M/2/)与我的例子,它的作品完美。 在你的链接中,你只是做了与brittohalloran一样的两个承诺,而不是包装。在这种情况下,如果第一个失败,即使下一个承诺没有完成,失败/总是回调也会被调用。 – Mordhak