我正在开发一个严重依赖 Promises 的节点模块。出于某种原因,当应在 Promise 代码中引发异常时(例如“未定义不是函数”),异常消息不会显示在控制台中 - 承诺链似乎在没有任何反馈的情况下停止,我能做的只是猜猜是什么原因造成的。如何强制 Node 显示所有异常?
问问题
207 次
1 回答
2
Promise 是安全的——也就是说,它们将抛出转换为拒绝。如果在 a 中抛出异常,then
您会收到拒绝的承诺,您可以恢复而不是使整个服务器崩溃。
较旧的 Promise 库和原生 Promise 不具有“未处理的拒绝跟踪”功能,并且基本上会抑制您的错误。较新的库具有“未处理的拒绝跟踪”,它不会表现出您描述的行为。
您的选择是:
- 使用像 Bluebird promise 这样的新库,它会将未处理的拒绝记录到您的控制台。也就是说 - 图书馆实际上为您解决了这个问题。
- 在某些库中,您可以
.done
在 Promise 链的末尾使用将未处理的拒绝转换为抛出的异常。 - 对于原生承诺,这是一个真实、痛苦和开放的问题。您必须添加
.catch(function(e){ setTimeout(function(){ throw e; }); })
的是 - 明确地不安全地抛出并导致错误显示。您必须为每个承诺链末端执行此操作。我个人觉得这很烦人。
请注意,预计 v8最终会解决这个问题,并且行为类似于 bluebird promise,但是我们还没有最后期限。一般来说,我认为原生 Promise 还没有准备好在节点中的黄金时间,最好使用强大的库。
于 2014-12-07T20:45:40.520 回答