首页 > web前端 > js教程 > 什么时候使用 `.then(success, failure)` 是 Promise 中的反模式?

什么时候使用 `.then(success, failure)` 是 Promise 中的反模式?

Patricia Arquette
发布: 2024-12-28 18:36:13
原创
843 人浏览过

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

.then(success, failure):何时将其视为 Promise 的反模式?

在 Bluebird Promise 常见问题解答中,.then(success, failed) 被标记作为反模式。这可能会令人困惑,特别是如果您不理解有关 try 和 catch 语句的解释。

.then(success, failed) 有什么问题?

.then() 调用如果回调抛出错误,则返回一个拒绝的承诺。这意味着如果成功记录器失败,错误将传递给以下 .catch() 回调,而不是伴随成功的失败回调。

控制流程图

.then 的控制流程有两个参数和 .then-catch 链如下所示:

[.then 和 .then-catch 的控制流程图的图像chain]

同步代码等效

用同步代码表达这一点:

// 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);
}
登录后复制

.then(success) 与 .then().catch()

将其与:

// some_promise_call().then(logger.log).catch(logger.log)
try {
    var results = some_call();
    logger.log(results);
} catch(e) {
    logger.log(e);
}
登录后复制

在此进行比较在这种情况下,catch 记录器会处理成功记录器调用中的异常。

.then(success, failure) 何时是反模式?

反对此模式的论点是,您通常应该在以下位置捕获错误:每个处理步骤并避免连锁使用。我们期望您只有一个最终处理程序来处理所有错误。

但是,在处理特定步骤中的特定错误并在没有错误发生时采取不同的操作时,此模式很有用。请注意,这会分支您的控制流。

改进的反模式示例

考虑以下内容:

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)` 是 Promise 中的反模式?的详细内容。更多信息请关注PHP中文网其他相关文章!

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