簡體   English   中英

保證Javascript中的異步請求回調順序

[英]Guaranteeing asynchronous request callback order in Javascript

在Javascript中,我有兩個對數據的異步請求:

$.getJSON('http://foo.com', fooQuery, fooSuccess(data));
$.getJSON('http://bar.com', barQuery, barSuccess(data));

和兩個回調來處理收到的數據:

fooSuccess(data) { // Stuff }
barSuccess(data) { // More Stuff }

如何確保僅在fooSuccess完成后執行barSuccess?

筆記:

  • 我希望保持數據請求的原樣:異步和非阻塞(因為服務器響應可能需要一段時間)。
  • 但是,我希望處理數據的回調順序執行。 也就是說,在fooSuccess完成之前,我不想執行barSuccess。

非常感謝你的智慧和幫助!

以下是使用ajax請求返回的jQuery延遲對象的方法。

var fooDfd = $.getJSON('http://foo.com', fooQuery);
var barDfd = $.getJSON('http://bar.com', barQuery);

fooDfd.then(function(fooData){
    fooSuccess(fooData);
    barDfd.then(barSuccess);
});

最好的方法是使用jQuery when().done()功能:

$.when(
    $.getJSON('http://foo.com', fooQuery, fooSuccess(data)), 
    $.getJSON('http://bar.com', barQuery, barSuccess(data))
).done(function(arg1, arg2){
    fooSuccess(arg1);
    barSuccess(arg2);
});

所有請求成功完成后,這允許同時執行AJAX請求並保證執行done()函數。

半小時前我正在關注這篇非常有趣的帖子,當看到由@Mike Brant呈現的優雅解決方案時,我很快就會潛入jquery庫,看看魔術是如何制作的。 不是嗎? 我推薦,非常有趣! BTW我認為我們不需要那么神奇,不是在這種情況下,我們有兩個異步調用處理程序(函數),無論哪個結束,我們需要知道第二個結束時,那么我們所需要的只是第三個函數這將由兩個處理程序調用,並在所有數據准備就緒時執行。 我知道這種方法將比優雅的jquery解決方案更多地消耗四到五行代碼,但最終我們的大腦和靈魂將處於更好的狀態。 對不起我的英文。

barSuccess調用放入fooSuccess成功回調中。

fooSuccess(data){
  jQuery.ajax({
    data: data,
    success: function(response){
      barSuccess(data) //should still be in scope, I think?
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM