簡體   English   中英

嵌套延遲的呼叫

[英]Nesting deferred calls

基本上,這就是我要用偽代碼執行的操作:

Fetch AsyncResultA
  If Success
    Fetch 
      AsyncResultB
      AsyncResultC
    Either Success/Fails
      Display any successful results
  If Fails
    Display error

這是我在jQuery中所做的,但是不起作用:

        $.when (

          fetchA()

        ).then (function (data, textStatus, jqXHR) {

            return {
              xhrObject1: [data, textStatus, jqXHR],
              xhrObject2: fetchB(),
              xhrObject3: fetchC(),
              xhrObject4: fetchD()
            }

          }, fail

        ).always( displayResults );

筆記:

所有fetch功能都是AJAX調用。

displayResults將獲取成功獲取的數據並立即顯示所有數據。 因此,只要fetchA成功,就會顯示某些內容。

fail時,只被調用fetchA失敗,從而消除任何進一步的讀取操作。

它不起作用,因為您不是從.then回調中返回承諾,而是從普通對象返回。 這樣的結果是, displayResults基本上是在fetchA返回的原始諾言上調用的。 文檔中的相關部分(重點是我的):

從jQuery 1.8開始, deferred.then()方法返回一個新的promise [...]。 這些過濾器函數可以返回要傳遞給.fail().done().fail()回調的新值,也可以返回另一個可觀察對象(Deferred,Promise等),該對象將傳遞其已解析/拒絕的狀態和值到諾言的回調

使用$.when並返回其返回值:

fetchA().then(function () {
    return $.when([].slice.call(arguments), fetchB(), fetchC(), fetchD());
}, fail).always( displayResults );

$.when返回一個承諾,該承諾在傳遞給自身的所有承諾都得到解決(或拒絕)時被解決。 因此,如果僅向其傳遞單個參數,則沒有理由使用$.when .。

如果不想在fetchA失敗時執行displayResults ,則可以單獨綁定失敗處理程序:

fetchA().fail(fail).then(function () {
    return $.when([].slice.call(arguments), fetchB(), fetchC(), fetchD());
}).always( displayResults );

暫無
暫無

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

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