次の例のようなPromise.allを含む.thenチェーンがある場合、エラーは最終的な.catchブロックで捕捉されます親チェーンやチェーンチェーン、あるいは独自のエラー処理が必要なのでしょうか?次のチェーンのPromise.allのPromiseが失敗するとどうなるか
答えて
あなたは各.then()
内部の約束を返却すると、エラーがでて、メインフローにチェーンされています。それに唯一の難点は、あなたがに手動で「再スロー」最初catch()
からの誤差を持っているだろうということですあなたの例では、.catch
メソッドはすべてのエラーをキャッチします。
は、この例を考えてみましょう。
Promise.resolve(1)
.then((n) => {
return Promise.all([
Promise.resolve(`a-${n}`),
Promise.reject(Error('Failed in Promise.all')), // comment for success
]);
})
.then(([a, b]) => {
const msg = `Responses: [${a}, ${b}]`;
console.log(msg);
return msg;
})
.catch((error) => { throw error; });
は、内側Promise.all()
は、それは親の流れによってキャッチされ拒否されています。
ここで約束をチェーンに関するいくつか読む:
.catch()
が拒否された約束の値を取得し、簡単に言えば#2 Nested Promises
はい、あなたの最後の(例では)catch()
によってキャッチされます。
また、単にPromise.all()
とthen()
後に別のcatch()
を挿入することができ、その場合には、両方のcatch()-es
が呼び出されます。
.then(([user, booking]) => {
const payment = { }
return Promise.all([
paymentService(payment),
Promise.resolve(user),
Promise.resolve(booking)
])
})
.catch((error) => {
// Error handling logic...
// Rethrow the error to allow the second catch to... catch it
throw error;
})
.then(([paid, user, booking]) => {
return Promise.all([
repo.makeBooking(user, booking),
Promise.resolve(paid),
Promise.resolve(user)
])
})
.catch((err) => {
//Error handling here
})
素晴らしい、ありがとうございました。 – Kainan
を。 Promise.prototype.catch(myHandler)
は、Promise.prototype.then(undefined, myHandler)
を呼び出すのと同じものです。したがって、
.then()
とチェーンされている約束事については、前回の約束が失敗した場合、後続の却下されたコールバックが呼び出されるということです。
ですから、次のコードを持っている場合:
Promise.resolve().then((resolve, reject) => {
console.log('this is the first promise');
reject();
}).then(() => {
console.log('this is the second promise');
reject();
}).catch((value) => {
console.log('this is the third promise')
});
出力された:
これは、これが第三約束
である第一約束
ですその理由は次のとおりです。Promise.resolve()は約束を作成します。約束通り#1にしましょう。
.then
は、新しいという約束を内側の約束の返還に等しいと返します。したがって、1行目の.then()
を呼び出すと、約束#2が作成されます。第2の.then()
コールは約束#3を生成する。
大丈夫です。今セットアップされているので、Promise#1はすでに解決されているので、成功ケースが必要です。それが「これは最初の約束」のプリントです。ハンドラの中で#2の約束を拒否します。
プロミス#2には1つのハンドラがあります(ボディは「これは第2の約束です」)。 Promise#2は拒否されているので、このハンドラは実行されません。 **連鎖約束の仕方は、これもまた、約束#3が拒絶されることを意味する**。したがって、catch()
ハンドラに到達すると、this is the third promise
の例が実行されます。
あなたはより多くの例については、ここで詳細を読むことができます:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch
- 1. JQuery PromiseがComponentDidMountで失敗するReact.JS
- 2. Promise.all()がPromise以外のオブジェクトを許可するのはなぜですか?
- 3. NodeJS PromiseをPromise.allに変換する
- 4. チェーンのPromiseリターンの誤解
- 5. VueJS Promiseが失敗しています
- 6. Promise.all()失敗を許す代替?
- 7. Promiseチェーンの再帰的な動作
- 8. writeToFileが失敗する - どのように失敗するのですか(どのツール)?
- 9. 別のクラスのpromiseチェーンから値を取得する
- 10. ディクショナリキーのスウィフト「let let ...」が失敗するとどうなりますか?
- 11. ネイティブPromiseチェーンで「キャッチ」はどのように機能しますか?
- 12. Promiseチェーンでの関数の抽出
- 13. はどのようにハンドルが失敗コールバックのチェーンとの約束を拒否rsvp.js
- 14. チェーンjqueryの約束が、取り扱いの失敗は別途
- 15. Promise.all()を呼び出す前にPromiseの配列が実行されているのはなぜですか?
- 16. ES6クラスPromiseチェーン - アクセス 'this'
- 17. 次のtfidfベクトル化が失敗するのはなぜですか?
- 18. Sequelize Promiseのチェーンの最終結果を取得する
- 19. http.get()はPromiseとObservableとして失敗します
- 20. キュウリの失敗したステップと失敗をどのように予想するのですか?
- 21. どのような条件が失敗するのかをどのように理解できますか?
- 22. ハッシュが空であるかどうかチェックするのがなぜ失敗するのですか?
- 23. doOnNext()は、次のチェーンを考えると
- 24. request-promise - 関数外のPromiseからどのように結果を得ることができますか?
- 25. 動的SQL:シーケンスの次の値が失敗する
- 26. チェリーを再試行するとチェーンの一部であるタスクが失敗する
- 27. 次のflex/parsleyコードで 'id'を指定しないと、なぜ注入が失敗するのですか?
- 28. adbが失敗して[INSTALL_PARSE_FAILED_NO_CERTIFICATES]に失敗するのはなぜですか?
- 29. promiseチェーンで待っています
- 30. このテストはなぜ失敗しますか?次のように
これは明確に答えます。ありがとうございました。 – Kainan
ネストされた約束についての良いリンクを追加しました;) – jherax