私は解決するPromiseの配列を持っていますPromise.all(arrayOfPromises);
私は約束の連鎖を続けます。こんな感じです
existingPromiseChain = existingPromiseChain.then(function() {
var arrayOfPromises = state.routes.map(function(route){
return route.handler.promiseHandler();
});
return Promise.all(arrayOfPromises)
});
existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
// do stuff with my array of resolved promises, eventually ending with a res.send();
});
エラーが発生した場合に個々のプロミスを処理するための catch ステートメントを追加したいのですが、試してみると、Promise.all
最初に見つかったエラーが返され (残りは無視されます)、配列内の残りのプロミス (エラーが発生しなかったもの) からデータを取得できません。
私は次のようなことを試しました:
existingPromiseChain = existingPromiseChain.then(function() {
var arrayOfPromises = state.routes.map(function(route){
return route.handler.promiseHandler()
.then(function(data) {
return data;
})
.catch(function(err) {
return err
});
});
return Promise.all(arrayOfPromises)
});
existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
// do stuff with my array of resolved promises, eventually ending with a res.send();
});
しかし、それは解決しません。
ベストアンサー1
Promise.all
すべてかゼロかです。配列内のすべての Promise が解決されると解決され、そのうちの1 つが拒否されるとすぐに拒否されます。言い換えると、解決されたすべての値の配列で解決されるか、単一のエラーで拒否されます。
一部のライブラリには と呼ばれるものがありPromise.when
、これは配列内のすべてのPromise が解決または拒否されるまで待機するものと理解していますが、私はこれに詳しくなく、ES6 にはありません。
あなたのコード
ここで他の人が言っているように、あなたの修正は機能するはずです。成功した値とエラー オブジェクトが混在する可能性のある配列で解決されるはずです。成功パスでエラー オブジェクトを渡すことは珍しいことですが、コードがエラー オブジェクトを期待していると仮定すると、問題はないと思います。
これが「解決しない」唯一の理由は、あなたが示していないコードで失敗していること、そしてこれに関するエラー メッセージが表示されない理由は、このプロミス チェーンが最後の catch で終了していないためです (とにかく、あなたが示している限りでは)。
私は、あなたの例から「既存のチェーン」を除外し、catch でチェーンを終了させました。これはあなたにとっては適切ではないかもしれませんが、これを読んでいる人にとっては、チェーンを常に返すか終了することが重要です。そうしないと、潜在的なエラー、さらにはコーディング エラーも隠れてしまいます (ここで起こったのはこれだと思います)。
Promise.all(state.routes.map(function(route) {
return route.handler.promiseHandler().catch(function(err) {
return err;
});
}))
.then(function(arrayOfValuesOrErrors) {
// handling of my array containing values and/or errors.
})
.catch(function(err) {
console.log(err.message); // some coding error in handling happened
});