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

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

Barbara Streisand
リリース: 2024-12-25 22:15:13
オリジナル
487 人が閲覧しました

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

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

Bluebird の Promise FAQ では、.then(success, failed) の使用はアンチパターンであると示唆されています。これは、.then() 呼び出しは、コールバックがエラーをスローした場合に拒否される Promise を返すためです。したがって、success logger コールバックが失敗すると、エラーは次の .catch() コールバックに渡されますが、success コールバックと一緒に提供されるfail コールバックには渡されません。

制御フロー図:

[2 つの引数を持つ then と 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);
}

// some_promise_call().then(logger.log).catch(logger.log)
try {
    var results = some_call();
    logger.log(results);
} catch(e) {
    logger.log(e);
}
ログイン後にコピー

パターンの理論的根拠:

通常、エラーはすべてのステップで捕捉されます。すべてのエラーが単一の最終ハンドラーで処理されるように、処理とエラー処理が集中化されます。ただし、アンチパターンで説明されているパターンは、次の場合に役立ちます。

  • 特定のステップでエラーを処理する必要がある。
  • エラーが発生しない場合、その後のアクションは大きく異なります。

このパターンでは、コントロールに分岐が導入される可能性がありますflow.

推奨パターン:

コールバックを繰り返す代わりに、.catch() と .done() の使用を検討してください:

some_promise_call()
   .catch(function(e) {
       return e; // it's OK, we'll just log it
   })
   .done(function(res) {
       logger.log(res);
   });
ログイン後にコピー

.finally().

の使用を検討することもできます。

以上が`.then(success, failed)` の使用が Promise のアンチパターンになるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート