違いは何ですか?
.then()
コールは、コールバックがエラーをスローする場合には拒否されます約束を返します。つまり、成功logger
が失敗すると、エラーは次の.catch()
コールバックに渡されますが、fail
と一緒に行くコールバックには渡されませんsuccess
。
これは制御フロー図です:
同期コードでそれを表現するには:
// some_promise_call().then(logger.log, logger.log)
then: {
try {
var results = some_call();
} catch(e) {
logger.log(e);
break then;
} // else
logger.log(results);
}
2番目log
(の最初の引数と同様.then()
)は、例外が発生しなかった場合にのみ実行されます。ラベル付けされたブロックとbreak
ステートメントは少し奇妙に感じます、これは実際にはpythonが持っているものtry-except-else
です(推奨読書!)。
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
catch
ロガーはまた、成功のロガーの呼び出しからの例外を処理します。
違いはこれくらいです。
トライアンドキャッチについては説明がよくわかりません
議論は、通常、処理のすべてのステップでエラーをキャッチする必要があり、チェーンでそれを使用すべきではないということです。すべてのエラーを処理する最終ハンドラーは1つしかないことが予想されますが、「アンチパターン」を使用すると、then-callbackの一部のエラーが処理されません。
ただし、このパターンは実際には非常に便利です。このステップで発生したエラーを処理し、エラーが発生しなかったとき、つまりエラーが回復不能な場合に、まったく異なる処理を実行したい場合。これにより、制御フローが分岐することに注意してください。もちろん、これが望ましい場合もあります。
これの次の何が問題になっていますか?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
コールバックを繰り返す必要があったこと。あなたはむしろ
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
.finally()
このために使用することも検討してください。
then().catch()
カンマを探してこのコールバックが成功または失敗の分岐かどうかを調査する必要がないため、より読みやすくなっています。