【问题标题】:What is a "false positive" rejected promise? possiblyUnhandledRejection?什么是“误报”被拒绝的承诺?可能是UnhandledRejection?
【发布时间】:2016-11-28 23:42:40
【问题描述】:

我在 node 中使用 Bluebird Promise 库。

我的代码中有一个部分捕获被拒绝的承诺并且不会重新抛出它。

"unhandledRejection" 之后仍然会被相同的 promise 触发 - 为什么它已经被处理过?

什么是“可能未处理的拒绝”?

http://bluebirdjs.com/docs/api/error-management-configuration.html

但是,因为可以随时处理被拒绝的承诺 在不确定的未来,一些编程模式将会 导致误报。因为这样的编程模式不是 必要且始终可以重构以防止误报, 我们建议这样做以使调试尽可能简单。

这里提到的“编程模式”是什么?

这是否与这种模式有关(一个被拒绝的承诺被链接两次或更多,其中一个没有捕获): https://github.com/petkaantonov/bluebird/issues/695#issuecomment-155373565

谢谢

【问题讨论】:

  • 如果您在代码方面需要帮助,请向我们展示该部分。
  • 对于您对 Bluebird 文档的该部分有疑问,我并不感到惊讶。还不清楚。

标签: javascript node.js promise bluebird


【解决方案1】:

提到的编程实践涉及仅在错误已经发生之后才安装错误处理程序。举个例子,

var a = Promise.delay(Math.random()*1000)
        .then(function(){ throw new Error(); });
var b = Promise.delay(Math.random()*1000)
        .then(function() { return a; })
        .catch(function() { console.log("It's ok."); });

在大约一半的情况下,a 的延迟比 b 的短,我们会收到 unhandledRejection 警告。

这是否与一个被拒绝的承诺被链接两次或更多而其中一个没有捕获的模式有关?

不,这只是一个错误。所有分支都需要有一个错误处理程序。

【讨论】:

  • 谢谢,那么在您的示例中false positive 是什么?你知道是否有计划在原生 Promise 中实现 delayallSettled 方法?
  • 我的理解是否正确,当回调function() { return a; } 被执行时,a 处于rejected 状态?所以这就是function() { return Promise.reject(valueAIsRejectedWith); }
  • 我上面的问题有什么问题,或者我应该创建新问题吗?
  • @Maximus 是的,就是这样。执行该回调时,拒绝由catch 处理,但之前可能已报告为unhandledRejection。在这种情况下这是错误的。关于delayallSettled,没有也没有。
  • @Maximus 是的。目前正在讨论的唯一方法是finally
猜你喜欢
  • 2018-05-09
  • 2020-02-08
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 2022-07-18
  • 2017-08-12
相关资源
最近更新 更多