promise的错误处理程序中的错误将丢失

时间:2014-08-20 16:01:04

标签: javascript google-chrome promise

如果我在promise catch处理程序中抛出错误,则错误永远不会冒出来!

Promise.resolve()
  .then(function() { return foo.bar(); })
  .then(function() { return console.log('ok!'); })
  .catch(function(err) { return baz.quux(); });

在带有promise模块的Node v0.8和Chrome 36的JavaScript控制台中,都不打印任何内容。我希望看到ReferenceError: baz is not defined出现某处

我们不应该看到某事吗?这是我错过的承诺规范的一部分吗?

更新:澄清:Chrome 36的V8中没有任何第三方模块。

1 个答案:

答案 0 :(得分:2)

是的,这是承诺实施面临的问题。然而,你选择的两个失败了很糟糕。确实 - 在您的情况下误解了错误,除非您自己附加错误处理程序,否则您将无法获得此静默失败的任何指示。

您的选择是:

  • 使用提供.done之类的Q的库,并手动将.done附加到代码中的每个承诺,以表明您不会为其附加处理程序。
  • 使用像Bluebird这样的库或何时进行未处理的拒绝检测。

特别是,Bluebird比本机承诺更快,并且做得恰当。它也是本机承诺的超集,因此您可以根据需要编写使用该子集的代码(尽管它具有更丰富的API)。您上面的代码记录了Bluebird的未处理拒绝。

顺便说一下,Firefox处理得更好,Firefox原生承诺会检测未处理的拒绝。