3 回答

TA貢獻1807條經驗 獲得超9個贊
更復雜的諾言庫有一個allSettled()類似的功能Q或Promise.settle類似藍鳥。
在jQuery中,您也可以自己實現這樣的函數并$使用它擴展命名空間,但只有在經常需要它并進行性能優化時才需要這樣做。
一個更簡單的解決方案是為你正在等待的每一個創建一個新的承諾,并且即使當底層的一個被拒絕時也要實現它們。然后你可以$.when()毫無問題地使用它們。簡而言之:
// using Underscore's .invoke() method:
$.when.apply(null, _.invoke(promises, "then", null, $.when)).done(…)
更穩定:
$.when.apply($, $.map(promises, function(p) {
return p.then(null, function() {
return $.Deferred().resolveWith(this, arguments);
});
})).then(…);
您可以then稍微更改回調以區分最終的已完成和已拒絕的結果done。

TA貢獻1829條經驗 獲得超7個贊
鐵匠鋪,
首先讓我們假設你的承諾是一個數組。
var promises = [....];
您似乎想要的是.when()應用于這些承諾的某些轉換,這樣任何被拒絕的承諾都會轉換為已解決,同時對已經解決的承諾透明。
所需的操作可以非常簡潔地寫成如下:
$.when.apply(null, $.map(promises, resolvize)).done(...);
//or, if further filtering by .then() is required ...
$.when.apply(null, $.map(promises, resolvize)).then(...);
resolvize轉換機制在哪里。
那應該resolvize()怎么樣?讓我們利用特征.then()來區分已解決和被拒絕的承諾,并做出相應的響應。
function resolvize(promise) {
//Note: null allows a resolved promise to pass straight through unmolested;
return promise.then(null, function() {
return $.Deferred().resolve.apply(null, arguments).promise();
});
}
未經測試
與resolvize在某些外部范圍,它可以被提供給被用在$.when.apply($.map(promises, resolvize))任何需要它的表達。這很可能是足夠的,沒有達到用新方法擴展jQuery的程度。
無論轉變如何實現,您最終都會遇到潛在的問題; 即知道.done()回調的每個參數,是否最初解決或拒絕其相應的承諾。這是您將拒絕轉換為解決方案所付出的代價。但是,您可以從原始承諾被解決/拒絕的參數中檢測原始狀態。
添加回答
舉報