避免 .then(success, failed) 的论证
Bluebird 承诺常见问题解答建议不要使用 .then(success,失败)作为反模式。虽然 try-catch 块看起来相似,但存在差异:
控制流差异:
.then(success, failure) 返回一个将被拒绝的承诺,如果成功回调会抛出错误。这意味着如果成功记录器失败,错误将传递给 .catch() 回调,而不是失败回调。
控制流程图:
[然后用两个参数](https://i.sstatic.net/WAcpP.png)
[Then-catch chain](https://i.sstatic.net/wX5mr.png)
同步等效:
// then: { try ... catch(e) { ... } else ... } try { var results = some_call(); } catch(e) { logger.log(e); break then; } // else logger.log(results);
处理异常:
.catch() 记录器还将处理成功的异常记录器调用,提供更全面的错误处理机制。
预测反模式的有用性
虽然反模式通常不被鼓励,但它在以下情况下可能很有用:
警告:请注意,这种方法会在控制流中引入分支。
替代 .then(成功,失败)
为了避免代码重复,请考虑使用 .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, failure)` 是 JavaScript Promise 中的反模式?的详细内容。更多信息请关注PHP中文网其他相关文章!