javascript - Promise 的错误处理程序中的错误丢失

标签 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(); });

在 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/

相关文章:

javascript - 从 javaScript Phonegap 上传文件的方法

Java Selenium ChromeDriver SendKeys 真的很慢

google-chrome - 如何在 Chrome 调试器中查看 enctype = "multipart/form-data"的表单数据

multithreading - template <typename>不能推断出指针类型吗?

javascript - 如何为 PhantomJS 编写同步 JavaScript 代码

javascript - 让foreach在javascript循环中一一显示?

php - Twitter Web 意图 - 获取关注者屏幕名称?

javascript - 如何使用 angularjs webapp 渲染登陆页面?

javascript - docker/ Selenium / headless Chrome : Configure SUID sandbox correctly

javascript - Promise的用法。递归中的所有操作似乎都不起作用