2017-05-06 5 views
1

私は、失敗する可能性のあるところでいくつかの約束を実行しようとしています。誰かが失敗した場合、どの人が失敗したのか、そして失敗していない約束の結果にまだアクセスできるようになるにはどうすればよいでしょうか?promise.allで解決された約束es6にアクセスする方法

現在、私はPromise.allを使用していますが、約束が失敗した場合はPromise.allが自動的にキャッチエラーブロックに入り、.thenブロックから何もアクセスできないので、私は約束どおりにアクセスできません結果。助けてもらえますか?

マイフィドル:https://jsfiddle.net/9u2nL7zj/

マイコード:

let promise1 = new Promise((resolve, reject) => { 
    console.log('-uno-') 
    resolve('-promise 1 success') 
}) 

let promise2 = new Promise((resolve, reject) => { 
    console.log('-dos-') 
    reject('-promise 2 fail') 
}) 

let promise3 = new Promise((resolve, reject) => { 
    console.log('-tres-') 
    reject('-promise 3 fail') 
}) 


let promise4 = new Promise((resolve, reject) => { 
    setTimeout(() => { 
    console.log('-cuatro-') 
    resolve('-promise 4 success-') 
    }, 3000) 
}) 


Promise.all([promise1, promise2, promise3, promise4]).then((res) => { 
    console.log('--done--', res) 
}).catch((err) => { 
    console.log('--err--', err) 
}) 
+1

私が正しく理解していれば、失敗したものがある場合でも解決したすべての約束の結果にアクセスしたい場合(失敗したものの後で解決できるものを含むか、それ以外の場合は複雑です...)すべてを待つよね?私には、それは[その質問](http://stackoverflow.com/q/31424561/6730571)と非常によく似ています。 「Promise.all」は、すべてが解決しなければならないことを意味します。あなたが望むのは、[Q](https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled)の 'Promise.allSettled'のようなものですが、これは標準ではない、それはライブラリです。 –

答えて

0

Promise.allはこの問題について移動する最良の方法であるようには思えません。 MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)から:

渡された約束のいずれかが拒否した場合、Promise.allはすぐに他の約束が解決したかどうか、拒否された約束の値を拒否します。

したがって、Promise.all()は、すべての約束を解決する必要がある場合に使用します。あなたが一緒に解決するためにそれらをすべて必要とする理由はありますか?もしそうでなければ、それ自身の.then()と.catch()ブロックというそれぞれの約束を与えるのが最善でしょう。

関連する問題