1. ホーム
  2. javascript

[解決済み] Promise.allのエラー処理

2022-03-15 14:11:27

質問

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();
});

しかし、それでは解決しない。

ありがとうございました。

--

編集する

以下の回答が言っていることは全くその通りで、他の理由でコードが壊れていたのです。もし興味があるなら、これが私がたどり着いた解決策です。

Node Expressサーバーチェーン

serverSidePromiseChain
    .then(function(AppRouter) {
        var arrayOfPromises = state.routes.map(function(route) {
            return route.async();
        });
        Promise.all(arrayOfPromises)
            .catch(function(err) {
                // log that I have an error, return the entire array;
                console.log('A promise failed to resolve', err);
                return arrayOfPromises;
            })
            .then(function(arrayOfPromises) {
                // full array of resolved promises;
            })
    };


APIコール(route.asyncコール)

return async()
    .then(function(result) {
        // dispatch a success
        return result;
    })
    .catch(function(err) {
        // dispatch a failure and throw error
        throw err;
    });

を置くことで .catch に対して Promise.all の前に .then は、元の約束からのエラーをキャッチする目的を果たしているようですが、その後、配列全体を次の .then

ありがとうございます。

解決方法は?

Promise.all はオール・オア・ナッシングです。配列の中のすべての約束が解決されると解決されます。 一つ が拒否される。言い換えれば、すべての解決された値の配列で解決するか、単一のエラーで拒否するかのどちらかです。

一部のライブラリでは Promise.when を待機させるのだと理解しています。 すべて しかし、私はそれをよく知らないし、それはES6にはありません。

あなたのコード

私はあなたの修正が動作するはずであることをここで他の人と同意する。成功した値とエラーオブジェクトが混在した配列で解決されるはずです。エラーオブジェクトをsuccess-pathに渡すのは珍しいですが、あなたのコードがそれを期待していると仮定すれば、私は何の問題もないと思います。

なぜそれが "not解決"するのか私が考える唯一の理由は、あなたが見せていないコードで失敗していることです。このことに関するエラーメッセージが表示されない理由は、このプロミスチェーンが最終キャッチで終了していないためです(あなたが見せている限りでは、とにかく)。

私は、あなたの例から"既存のチェーン"をファクタリングし、キャッチでチェーンを終了させることを勝手に決めました。これはあなたにとって正しいことではないかもしれませんが、これを読んでいる人にとっては、常にチェーンを返すか終了させるかが重要で、そうしないと潜在的なエラー、たとえコーディングエラーであっても、隠されてしまいます(ここで起こったと思われることです)。

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
});