Bluebird Promise FAQ では、.then(success, failed) にフラグが立てられていますアンチパターンとして。これは、特に try ステートメントと catch ステートメントに関する説明を理解していない場合、混乱する可能性があります。
.then() 呼び出しコールバックがエラーをスローした場合に拒否する Promise を返します。これは、成功ロガーが失敗した場合、エラーは成功に伴う失敗コールバックではなく、次の .catch() コールバックに渡されることを意味します。
.then の制御フロー2 つの引数と .then-catch チェーンを以下に示します。
[.then と .then-catch の制御フロー図のイメージ] .then-catch チェーン]
これを同期コードで表現するには:
// 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); }
これを比較してくださいwith:
// some_promise_call().then(logger.log).catch(logger.log) try { var results = some_call(); logger.log(results); } catch(e) { logger.log(e); }
この場合、キャッチ ロガーは成功ロガー呼び出しからの例外を処理します。
このパターンに対する反論は、一般にすべての処理ステップでエラーを検出し、連鎖的に使用することを避ける必要があるということです。すべてのエラーに対して最終ハンドラーは 1 つだけであることが期待されます。
ただし、このパターンは、特定のステップで特定のエラーを処理し、エラーが発生しない場合に別のアクションを実行する場合に役立ちます。これにより制御フローが分岐することに注意してください。
次の点を考慮してください。
some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); });
あるいは、この目的で .finally() を使用することもできます。
以上がPromise で `.then(success, failed)` を使用することがアンチパターンになるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。