スミシー、
まず、約束が配列にあると仮定しましょう。
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()
、対応する promise が最初に解決されたか拒否されたかを知ることができます。それは、拒否を解決に変えるために支払う代償です。ただし、元の約束が解決/拒否されたパラメーターから元のステータスを検出できる場合があります。