[解決済み] 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();
});
しかし、それでは解決しない。
ありがとうございました。
--
編集する
以下の回答が言っていることは全くその通りで、他の理由でコードが壊れていたのです。もし興味があるなら、これが私がたどり着いた解決策です。
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
});
関連
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
vueディレクティブv-bindの使用と注意点
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
Vueのイベント処理とイベントモディファイアの解説
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】ローカルファイルを開くことができません - Chrome: ローカルリソースの読み込みが許可されていない
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】Node.js Error: Cannot find module express
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'D:\.... \node_modules
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
要素ツリー制御によるvueTreeテーブル
-
WeChatアプレット用ユニアプリによるグローバルシェアリング
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
Vueにシンプルなメモ帳機能を実装
-
Vueのクラススタイルの使い方の詳細
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】JavaScript TypeError: null のプロパティ 'style' を読み取ることができない
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。
-
[解決済み】一部の約束が拒否されても、すべての約束が完了するまで待つ