如果我在 Promise 的 catch
处理程序中抛出错误,该错误永远不会冒泡!
Promise.resolve()
.then(function() { return foo.bar(); })
.then(function() { return console.log('ok!'); })
.catch(function(err) { return baz.quux(); });
在 Node v0.8 中都带有 promise模块和 Chrome 36 的 JavaScript 控制台,这不会打印任何内容。我期待看到 ReferenceError: baz is not Defined
出现在某处。
我们不应该看到一些东西吗?这是我错过的 promise 规范的一部分吗?
更新:澄清:这种情况发生在 Chrome 36 的 V8 中,没有任何第三方模块。
最佳答案
是的,这是 Promise 实现面临的一个问题。然而,您选择的两个人却表现得很糟糕。事实上 - 在你的情况下,错误被吞没了,事实上,除非你自己附加一个错误处理程序,否则你不会得到任何关于这种无声失败的指示。
您的选择是:
- 使用像 Q 一样提供
.done
的库,并手动将.done
附加到代码中的每个 Promise,以表明您不会向其附加处理程序。< - 使用 Bluebird 或 When 等库来执行未处理的拒绝检测。
特别是,Bluebird 比原生 Promise 更快,而且做得很好。它也是 native Promise 的超集,因此您可以根据需要编写使用该子集的代码(尽管它具有更丰富的 API)。您上面的代码记录了 Bluebird 未处理的拒绝。
顺便说一句,Firefox 处理这个问题要好得多,并且 Firefox native promise 检测未处理的拒绝。
关于javascript - Promise 的错误处理程序中的错误丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25409391/