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