2016-11-28 9 views
4

を考えると、次のPromise.allのすべての拒否された約束をキャッチすることは可能ですか?

Promise.all(promises).then(resolved => { 
    ... 
}).catch(rejected => { 
    ... 
}); 

rejectedだけ拒否された最初の約束が含まれています。キャッチする方法はありますかすべて拒否されていますか?

+1

個別に、はい.allではありません。あなたが見つけたように、最初の拒否された約束はキャッチを投げる。彼らがすべて終わるのを待っているわけではありません。あなたはそれぞれの約束を巡回し、それぞれにキャッチハンドラーをつけ、何らかの形でそれらが完了したときに何かを見つけなければならないでしょう(その時点で.allは役に立たないので) –

+0

'rejected'は拒否されるべき約束を含んでいません - それは拒絶された**理由**を含むでしょう。 –

+1

Bluebirdでこのケースを扱う方法については、[この質問](http://stackoverflow.com/questions/37902927/resolve-and-re-preises-in-bluebird)を参照してください。検査は物事をより容易にする。 – estus

答えて

10

もちろん、これを行うには、すべての入力約束が解決するまで待つ必要があります。保留中の、拒否する可能性がある限り、すべての拒否権があることを確認することはできません!

だからPromise.allを使用できますが、入力を変換した後に拒否をキャッチし、

caughtPromises = promises.map(promise => promise.catch(Error)); 

今すぐにPromise.allの結果をフィルタリングするにように、おそらくErrorオブジェクトでそれらをラップすることによって、それらを識別するように約束します失敗として識別されたものを見つけます:

Promise.all(caughtPromises) 
    .then(results => results.filter(result => result instanceof Error)) 

etvoilà。

0

すべての約定が解決(解決または拒否)されるのを待つ通常の方法は、Promise.settle()のようなものを使用することです。 ES6 Promise.all() error handle - Is .settle() needed?

基本的なコンセプトは、それぞれの約束事を拒否を捕捉(および保存)するラッパーでラップし、それを解決に変え、その結果として得られる約束を次のように渡すというものです。 Promise.all()Promise.all()に渡すすべての約束が解決されるので(それは拒否されません)、すべてを待つでしょう。

あなたは彼らがこのようにそれを使用します:しかし、その後、結果の値は、あなたが解決され、拒否された約束かを確認するために反復処理できる配列になります

Promise.settle(arrayOfPromises).then(function(results) { 
    results.forEach(function(pi, index) { 
     if (pi.isFulfilled()) { 
      console.log("p[" + index + "] is fulfilled with value = ", pi.value()); 
     } else { 
      console.log("p[" + index + "] is rejected with reason = ", pi.reason()); 
     } 
    }); 
}); 

のための上記のリンク投稿を参照してください。ここで繰り返さないようにPromise.settle()の実際のコード。

関連する問題