[英]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.