首页 > web前端 > js教程 > 'then(success, failed)”什么时候是 Promise 的反模式?

'then(success, failed)”什么时候是 Promise 的反模式?

DDD
发布: 2024-12-22 06:07:12
原创
560 人浏览过

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

.then(success, failed) 什么时候被视为 Promises 的反模式?

promise 中的 .then(success, failure) 语法可以被视为反模式在某些情况下。让我们探讨一下原因,并将其与 .then().catch() 方法进行比较。

控制流差异

.then(success, failed) 返回一个如果回调函数被拒绝的 Promise抛出错误。因此,如果成功记录器失败,错误将传递给后续的 .catch() 处理程序,而不是失败回调。

反模式场景

在以下场景中,使用 .then( success、fail) 会出现问题:

some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
登录后复制

如果 success 日志记录功能失败,错误将不会被 failed 捕获回调,但由链中的下一个 .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)反模式在您想要执行以下操作的情况下非常有用:

  • 专门处理给定的错误
  • 根据是否发生错误采取不同的操作。

但是,请务必记住,此模式会在控制流中引入分支,这可能并不理想在某些情况下。

替代选项

代替 .then(成功,失败), .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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板