3 回答

TA貢獻(xiàn)1856條經(jīng)驗 獲得超5個贊
我認(rèn)為最簡單的方法是Deferred為每個AJAX請求保留一個輔助對象,并確保始終解決該問題:
var d1 = $.Deferred();
var d2 = $.Deferred();
var j1 = $.getJSON(...).complete(d1.resolve);
var j2 = $.getJSON(...).complete(d2.resolve);
$.when(j1, j2).done( only fires if j1 AND j2 are resolved );
$.when(d1, d2).done(function() {
// will fire when j1 AND j2 are both resolved OR rejected
// check j1.isResolved() and j2.isResolved() to find which failed
});
這是利用.complete()jQuery添加到AJAX 方法的Promise中的附加AJAX方法,該方法被同時用于已解決和已拒絕的Promise。
注意:d1.resolve本身可作為回調(diào),它不需要包裝在一個function() { ... }塊中。

TA貢獻(xiàn)1841條經(jīng)驗 獲得超3個贊
它幫助我消除了我創(chuàng)建的黑客程序,其中我在某種程度上人為地解決了諾言(無論潛在結(jié)果如何),以便我可以使用“何時”批處理多個請求并使用“完成”不管他們成功/失敗都繼續(xù)前進(jìn)。
我正在“回答” Alnitak的答案,希望為他的建議提供另一種用途,該建議支持任意數(shù)量的潛在承諾。
var asyncFunc, entity, entities, $deferred, $deferreds;
// ...
foreach (entity in entities) {
$deferred = $.Deferred();
$deferreds.push($deferred);
asyncFunc(entity).done(...).fail(...).always($deferred.resolve);
}
// ...
$.when.apply($, $deferreds).done(...)
這是偽JavaScript,但是應(yīng)該傳達(dá)這種方法。對于某些任意大小的實體集,為每個實體創(chuàng)建一個遞延($ deferred)并將其推送到一個數(shù)組($ deferreds),進(jìn)行異步調(diào)用,根據(jù)需要添加完成/失敗,但始終包含一個“始終”來解決此問題實體的延期付款。注意,“始終”接收延遲的解析功能而不是其調(diào)用。
'when'將$ deferreds數(shù)組轉(zhuǎn)換為'when'的參數(shù)列表,并且由于保證了這組deferreds的解析(感謝all),現(xiàn)在可以定義一個'done',它將被一次調(diào)用不管這些調(diào)用成功與否,異步調(diào)用都將完成。
添加回答
舉報