Promise.all でのエラー処理 質問する

Promise.all でのエラー処理 質問する

私は解決する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
});

おすすめ記事