【问题标题】:trap when.js unhandled rejections捕获 when.js 未处理的拒绝
【发布时间】:2015-06-23 17:03:57
【问题描述】:

我想捕获 when.js 未处理的拒绝,以便我可以记录它们。为了实现这一点,我重写了 console.warn(),但是它可以记录除 when.js 之外的我不感兴趣的内容。

参考:https://github.com/cujojs/when/blob/master/docs/api.md#debugging-promises

我正在使用 prettymonitor 和 when.js https://github.com/AriaMinaei/pretty-monitor

【问题讨论】:

标签: javascript promise when-js


【解决方案1】:

如果您在服务器端,则可以使用 promise 拒绝挂钩。这些将适用于服务器端的大多数 Promise 实现(io.js、bluebird、when 等):

 process.on("unhandledRejection", function(promise, reason){
    // deal with the rejection here.
 });

如果您在浏览器环境中,则事情的标准化程度较低。但是,When 仍然在那里提供类似的钩子:

window.addEventListener('unhandledRejection', function(event) {
    event.preventDefault(); // This stops the initial log.
    // handle event
    event.detail.reason; // rejection reason
    event.detail.key; // rejection promise key
}, false);

还有 local 拒绝钩子,如果您只想处理对 Promise 库的单个实例的拒绝,这些钩子非常有用 - 这通常在您自己构建库时很有用:

var Promise = require('when').Promise;
Promise.onPotentiallyUnhandledRejection = function(rejection) {
    // handle single instance error here
};

【讨论】:

  • 非常感谢。当我在浏览器中使用 when.js V2.51(Node 中的 V3.7)时,我一开始无法让它工作。我已将浏览器更新到 V3.7,window.addEventListener('unhandledRejection', ..) 可以解决问题。我现在也找到了github.com/cujojs/when/blob/master/docs/debug-api.md,这对我很有帮助。
  • @nevf 用于 node/io.js 的全局未处理拒绝 API 是相对较新的 - 作为作者,我非常感谢您的反馈 - 随时给我发电子邮件或发布回复当/如果您遇到暴露的 API 的问题和/或有关于它的建议时。
  • 我会将其添加到我的 node.js 应用程序中,如果有任何问题,我会通知您。我找到了堆栈,所以忽略我刚刚删除的文本。
  • Node.js process.on() 示例阻止显示正常的控制台/prettymonitor 输出。有没有办法保留这个。文档还显示:process.on('unhandledRejection', function(reason, key) 不是..(promise,reason)。参考:github.com/cujojs/when/blob/master/docs/debug-api.md
  • 这很有趣,@Benjamin Gruenbaum。因为对我来说,该解决方案在浏览器中不起作用。这可能是因为我使用 webpack 和 shim 来处理进程。在这种情况下,似乎 initEmitRejection(使用 when.js 3.7.7)会跳过发送事件。你能对此发表评论吗?
猜你喜欢
  • 2015-10-06
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 2016-07-21
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多