ホームページ >ウェブフロントエンド >jsチュートリアル >「then(success, failed)」が Promise のアンチパターンになるのはどのような場合ですか?

「then(success, failed)」が Promise のアンチパターンになるのはどのような場合ですか?

DDD
DDDオリジナル
2024-12-22 06:07:12607ブラウズ

When is `then(success, fail)` an Antipattern for Promises?

Promise の .then(success,fail) がアンチパターンとみなされるのはどのような場合ですか?

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() を優先します

代わりに、.then() と .catch() を別々に使用することをお勧めします。

some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })

この場合、.catch() ハンドラーは、成功ログ関数によってスローされたエラーもキャッチします。これにより、すべてのエラーが一貫した方法で処理されることが保証されます。

例外処理の目的

.then().catch() 構文はより優れたエラー処理を提供しますが、.then(success, failed)アンチパターンは、次のような状況で役立ちます。

  • 特定の特定のエラーを処理するstep.
  • エラーが発生したかどうかに基づいて、異なるアクションを実行します。

ただし、このパターンでは制御フローに分岐が導入され、望ましくない可能性があることを覚えておくことが重要です。特定の状況では、

代替オプション

.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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。