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

2023-12-25

我看了一下蓝鸟承诺常见问题解答 https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns,其中提到.then(success, fail)是一个反模式 https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-thensuccess-fail-anti-pattern。我不太明白它的解释try and catch。 以下有什么问题吗?

some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })

该示例似乎表明以下是正确的方法。

some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })

有什么不同?


有什么不同?

The .then()调用将返回一个承诺,如果回调抛出错误,该承诺将被拒绝。这意味着,当你成功时logger失败,错误将传递给以下.catch()回调,但不是fail伴随的回调success.

这是一个控制流图表:

用同步代码来表达:

// 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);
}

第二log(这就像第一个参数.then())只有在没有异常发生的情况下才会被执行。标记块和break感觉声明有点奇怪,实际上是这样的蟒蛇有try-except-else for https://stackoverflow.com/q/16138232/1048572(推荐阅读!)。

// some_promise_call().then(logger.log).catch(logger.log)
try {
    var results = some_call();
    logger.log(results);
} catch(e) {
    logger.log(e);
}

The catchlogger 还将处理成功 logger 调用中的异常。

差异就这么多了。

我不太明白它对 try 和 catch 的解释

争论的焦点是,通常,您希望在处理的每个步骤中捕获错误,并且不应该在链中使用它。我们期望您只有一个最终处理程序来处理所有错误 - 而当您使用“反模式”时,某些 then 回调中的错误不会被处理。

然而,这种模式实际上非常有用:当你想要处理恰好在这一步中发生的错误,并且你想做一些事情时完全不同当没有发生错误时 - 即当错误无法恢复时。Be aware这是分枝你的控制流程。当然,有时这是需要的。


以下有什么问题吗?

some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })

你必须重复你的回调。你宁愿想要

some_promise_call()
   .catch(function(e) {
       return e; // it's OK, we'll just log it
   })
   .done(function(res) {
       logger.log(res);
   });

您也可以考虑使用.finally() http://bluebirdjs.com/docs/api/finally.html为了这。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候 .the(success, failed) 被视为 Promise 的反模式? 的相关文章

随机推荐

  • Android SDK-camera2-在TextureView上绘制矩形

    我是 android 开发的新手 我发现很难在camera2 api 上找到好的例子 我慢慢地解决了大多数问题 但在这个问题上我陷入了困境 在默认相机中 当您触摸屏幕进行对焦时 屏幕会短暂显示一个矩形的对焦区域 我想做类似的事情 或者在这种
  • 组合两个 foreach 循环

    我有两个 foreach 循环 第一个 foreach items as key gt item keywords explode qsvarus title key preg replace b implode keywords b lt
  • 使用 Pandas 读取 GPS RINEX 数据

    我正在阅读 RINEX 3 02 第 60 页 观测数据文件来进行一些基于时间的卫星 ID 过滤 并最终将在稍后重建它 这将使我能够更好地控制卫星的选择 随着时间的推移 我可以通过 RTK 后处理为位置解决方案做出贡献 不过 特别是对于这一
  • 当用户关闭 Chrome 时关闭 Native Host

    我正在开发一个使用 C 本机主机的 Chrome 扩展 在background js 脚本 持久设置为 false 中 我使用 chrome onstartup 事件创建与 C 主机的连接 我希望只要用户积极使用 Chrome 我的主机就能
  • 关闭QMainWindow的正确方法

    我最近从 tkinter 更改为 Pyqt5 因为我正在 Python 3 7 8 中开发一个半大型应用程序 每次我不得不关闭窗口时我都会使用该方法self destroy 并且有一个很小的机会 当我关闭所有程序并且没有窗口时 解释器仍在运
  • 如何设置可跨文本视图之间的边距?

    我正在尝试创建可扩展的文本视图并在 EditText 中显示它 因此 用户可以在 EditText 中输入一些内容 如果用户按下键盘的 Enter 按钮 那么我会将此文本转换为可跨文本视图 此用户可以再次开始输入并按键盘的 Enter 按钮
  • Lucene:从索引中删除,基于多个字段

    我需要从 lucene 搜索索引中删除文档 标准方法 indexReader deleteDocuments new Term field name field value 不会成功 我需要根据多个字段执行删除 我需要这样的东西 pseud
  • 如何仅向 NSDate 添加工作日?

    我有一个与 Objective C 中计算工作日相关的问题 我需要添加X给定的工作日NSDate 例如 如果我有一个约会 2010 年 10 月 22 日星期五 我添加2工作日 我应该得到 2010 年 10 月 26 日星期二 提前致谢
  • 如何在 Android 中从 ArrayList 填充的列表视图中选择多个项目

    我正在尝试编写一个程序来选择我填充的列表视图中的多个项目 但我很难选择多个项目 请让我知道该怎么做 下面是我填充数组列表的方式 并且我有一个带有复选框的自定义行 我需要在按钮单击事件上获取所选项目 名称 编号 先感谢您 我试图理解其他帖子
  • Laravel 子域路由不起作用

    我正在尝试拥有一个管理子域 像这样 https laravel com docs 5 1 routing route group sub domain routing Route group domain gt admin localhos
  • HikariCP 和 maxLifetime

    我将我的项目移至HikariCP https github com brettwooldridge HikariCP 到目前为止一切都很顺利 但在一种设置下我遇到了麻烦 这是 setMaxLifetime 30 1000 HikariCon
  • 使用资源中的几何图形的 WPF 自定义按钮

    有没有办法使用这样的 PathGeometry 集合 路径1 F1 中号 170 255 178 837L 170 255 221 158C 170 255 228 917 164 174 230 777 156 745 225 286L
  • 如何处理 AJAX 中的预期错误(包括向用户公开它们)

    预期错误是我在代码中预期甚至自己提出的来自服务器的错误 例如 当用户尝试执行他没有足够权限的操作时 我会提出PermissionError 一个习俗Exception 并带有描述错误的消息 我一直在寻找一种好方法来处理 AJAX 情况下的预
  • 如何以声明方式管理 Kafka 主题?

    我们正在使用 Apache Kafka 并且有很多手动创建的主题 使用自定义主题配置 我们希望像代码一样管理我们的主题 就像我们的基础设施 配置的其余部分一样 我们如何以编程方式和声明方式管理我们的主题 什么是理智的方法 以下是可能适合您正
  • Rails:PG :: UndefinedTable:错误:关系“...”不存在

    迁移时我收到以下错误消息 PG UndefinedTable ERROR relation actioncodes does not exist ALTER TABLE organizations ADD CONSTRAINT fk rai
  • 使用 Polars 生成运行记录,其中一个月的期末余额将成为下个月的期初余额

    我想在给定初始期初余额的情况下生成一段时间内的运行计数模拟 例如 一个虚构的企业从 1000 美元开始 在任何一个月内都会经历随机的盈利和亏损 12 个月后 这家企业可能会赚多少钱 我的问题是 我可以生成所需的列 但无法弄清楚如何在不破坏当
  • phpMyAdmin get_scripts.js.php 和 messages.php 很慢

    当我检查 127 0 0 1 phpmyadmin 上的网络活动时 我发现 get scripts js php 和 messages php 需要 7 到 16 秒才能执行 我打开这些脚本并添加了缓存时间 但问题仍然存在 header E
  • Pygame 声音延迟 - 与缓冲区/采样无关

    我试图在我的小游戏中播放简单的 wav 文件 每当用户将鼠标悬停在按钮上时 就会播放一点点击声音 实际按下按钮时也是如此 因此 我遇到了每个未正确初始化混音器的人都会遇到的普遍滞后问题 然而 当我正确初始化它时 它仍然有 0 5 秒的延迟
  • 使用 BLPOP 的 Redis 作业队列

    我尝试使用 redis 和 ruby eventmachine 创建无限作业队列 为了实现这一点 我使用了 0 超时的 redis BLPOP 命令 成功 BLPOP 后 我再次运行它 我的方法正确还是有更好的方法来使用 Redis 创建作
  • 什么时候 .the(success, failed) 被视为 Promise 的反模式?

    我看了一下蓝鸟承诺常见问题解答 https github com petkaantonov bluebird wiki Promise anti patterns 其中提到 then success fail 是一个反模式 https gi