ホームページ >ウェブフロントエンド >jsチュートリアル >「then(success, failed)」が Promise のアンチパターンになるのはどのような場合ですか?
Promise の .then(success,fail) 構文はアンチパターンとみなされることがあります場合によっては。理由を調べて、.then().catch() アプローチと比較してみましょう。
.then(success, failed) は、コールバック関数が失敗した場合に拒否する Promise を返します。エラーがスローされます。したがって、成功ロガーが失敗した場合、エラーは失敗コールバックではなく後続の .catch() ハンドラーに渡されます。
次のシナリオでは、 .then(成功、失敗) が問題になります:
some_promise_call() .then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
成功ログ機能が失敗した場合、エラーは発生しません失敗コールバックによって捕捉されますが、チェーン内の次の .catch() ハンドラーによって捕捉されます。これにより、意図したエラー処理ロジックが中断される可能性があります。
代わりに、.then() と .catch() を別々に使用することをお勧めします。
some_promise_call() .then(function(res) { logger.log(res) }) .catch(function(err) { logger.log(err) })
この場合、.catch() ハンドラーは、成功ログ関数によってスローされたエラーもキャッチします。これにより、すべてのエラーが一貫した方法で処理されることが保証されます。
.then().catch() 構文はより優れたエラー処理を提供しますが、.then(success, failed)アンチパターンは、次のような状況で役立ちます。
ただし、このパターンでは制御フローに分岐が導入され、望ましくない可能性があることを覚えておくことが重要です。特定の状況では、
.then(success, failed) の代わりに、 .done() または .finally() メソッドを使用すると、完了またはエラーを一貫して処理できます。
// Handle errors and completion together some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); }); // Handle completion always, regardless of errors some_promise_call() .finally(function() { logger.log('Promise completed'); });
以上が「then(success, failed)」が Promise のアンチパターンになるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。