簡體   English   中英

多個同時ajax請求代理

[英]multiple simultaneous ajax requests broker

如何協調同時進行的ajax調用並僅在全部完成后才采取措施?

是否有一個方便的javascript幫助程序庫,該庫將協調對數據庫的多個同時ajax調用,並在所有ajax數據提取均返回其數據時調用指定的回調? 我想向我的“協調員”或“經紀人”提交准備好的隨時可用的ajax調用的字典,以及我的WhenAllCompleted回調函數。

用例很常見:在將數據庫記錄綁定到UI之前,必須填充所有外鍵數據關系的下拉列表,以便用戶看到有意義的值,而不是通常的整數鍵。存儲在記錄中。

如果已經有了一個健壯的標准庫,我寧願不重新發明所有的管道代碼來跟蹤每個ajax請求的狀態。

編輯:這是描述我想要做什么的偽代碼:

           when ajax1fetch is finished
           and
           ajax2fetch is finished
           and 
           ajax3fetch is finished
           and SELECT1 is populated
           and SELECT2 is populated
           and SELECT3 is populated
           bindRecordToUI()

在將代碼重組為使用$.when() ,我要在.ajax()成功回調中獲取數據,然后在該回調中填充SELECT。 當填充SELECT時,我將記錄綁定到UI。

如果我們提供$.when ajax調用列表,則在ajax請求完成時調用完成的回調,該完成發生 SELECT填充之前 (如果SELECT的項目列表很長)。

我不知何故需要將SELECT元素的填充作為附加的when-conditions,並找到一種方法,以將ajax調用返回的數據路由到填充函數(如果SELECT-populate函數不會在peform中執行)。 ajax成功回調。

您正在用JS尋找承諾 這是一個不錯的框架Q。 allSettled()函數就是您要尋找的東西。

Q.allSettled([saveToDisk(), saveToCloud()]).spread(function (disk, cloud) {
    console.log("saved to disk:", disk.state === "fulfilled");
    console.log("saved to cloud:", cloud.state === "fulfilled");
}).done();

來自API參考的代碼

由於您已經在使用jQuery,因此可以使用jQuery.when()方法等待多個Deferred結束。 需要注意的是jQuery.ajax()及其包裝方法,像jQuery.get()返回一個jqXHR對象,它是一個類型的Deferred

您將從$.ajax或等效調用中獲取Deferred ,然后將它們全部傳遞給$.when 您將獲得一個Promise ,它基本上是一個只讀的Deferred *。 然后,您可以在此Promise附加完成/錯誤處理程序,一旦所有傳入的Deferred都被解析,則將被解決;如果任何Deferred被拒絕,則被拒絕。

var def1 = $.ajax(),
    def2 = $.ajax({ /* some params */});

var masterPromise = $.when(def1, def2);

masterPromise.done(function() {
    console.log('def1 and def2 are done!');
});

  • Deferred允許附加各種完成和錯誤處理程序,以及解決和取消以及控制異步操作​​的方法。 Promise僅允許附加處理程序,並且不允許控制異步操作​​。 您可以使用Deferred.promise()方法從jQuery Deferred獲得Promise

暫無
暫無

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

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