如何应对悬空的承诺

时间:2015-09-16 01:41:10

标签: javascript angularjs promise es6-promise

通常我想调用一个promise,让它以异步方式运行而不是等待它。像:

... some code ...

fetchMyCount().then(count => {
  updateTheUI(count);
});

... more code ...

现在这很好用,但是我经常不会在承诺上放置一个失败处理程序,因为每个人都非常繁重。这就像在我的每次数据提取上加try {} catch {}

问题是,如果它失败了,它会默默地这样做。它不会抛出我的window.onerror可以获得的异常,它不会记录,也不会执行任何操作。

现在我可以制作一个很好的包装器,如:

Async(fetchMycount().then(count => {
  updateTheUI(count);
}));

一般可以处理promises,但是我必须记住包装每个异步调用。

有没有办法让像window.onerror这样的顶级处理程序或大try {} catch {}包装器可以捕获所有未处理的被拒绝的承诺,这样我就可以记录它们并确保它们得到固定?

2 个答案:

答案 0 :(得分:4)

这是一个常见的用例。你的问题是真的。在Node中,您有process.on("unhandledRejection", ...个事件you can use。可悲的是,这些在浏览器中还没有。与ES2015兼容的一些libraries承诺offer them,您可以使用这些support in browsers is coming,直到本机承诺得到支持。

好处是the polyfill,浏览器最终会支持这些钩子。

目前,我已经说服enter image description here添加它,所以如果您使用core-js polyfill,您可以这样做:

window.onunhandledrejection = function(e){
    // handle here e.promise e.reason
};

请注意,这假设某些内容是未处理的拒绝,如果:它未处理,并且没有同步附加错误处理程序(在任务中是准确的)。

答案 1 :(得分:1)

正是针对这样的问题,我编写了自己编写异步代码的实用程序:

https://github.com/vacuumlabs/yacol/

它对您现有的代码没有帮助,但是使用新编写的代码(以及许多其他内容)提供了相当高级的错误处理功能。

这就是说,我不认为“unhandledRejection”/“uncaughtException”事件是好的(尽管它是本地提供的最好的node.js)工具来做正确的错误处理:

  • 首先,您只能在进程范围内附加它,因此它会强制您以相同的方式处理所有未捕获的错误(与try-catch不同,您可以对源自代码的不同部分的错误做出不同的反应) )

  • 其次,如果在相同的事件循环运行中未将.catch附加到Promise,则会调用“unhandledRejection”。这可能导致捕获错误错误;请注意,稍后将错误处理程序附加到承诺是很好的!