当运行时错误发生时,如何通过本机Promise触发全局onError处理程序?

时间:2016-09-07 18:24:17

标签: javascript promise q es6-promise globalevent

使用Q.js我可以使用.done():

触发window.onerror
window.onerror = function() {
    console.log('error from handler');
}
var q = Q('initValue').then(function (data) {
    throw new Error("Can't do something and use promise.catch method.");
});
q.catch(function(error){
    throw new Error("This last exception will trigger window.onerror handler via done method.");
})
.done();

在原生Promise(ES6)中,我们没有 .done(),最后“.catch”是链的末尾:

var p = new Promise(function () {
    throw new Error("fail");
});
p.catch(function (error) {
    throw new Error("Last exception in last chain link");
});

.catch 中抛出新错误(...)”是重现运行时错误的最简单方法之一。实际上,它可能是运行时错误的另一个模拟(EvalError,SyntaxError,TypeError等),例如:

var a = [];
a(); // Uncaught TypeError: a is not a function

.done 用法是一个示例,用于解释我的目标更多细节。我没有重复 .done API的目标。

我的任务是:我在 window.onerror 上有一个承诺链和处理程序。链中的所有错误都可以通过 .cath 来处理,除了链末尾的运行时错误。当在promise的方法链的末尾发生任何运行时异常时,我需要在window.onerror上挂起被触发的处理程序。

限制:只有原生JS,必须使用 window.onerror

通过本机Promise触发此全局处理程序的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

异步抛出错误:

window.addEventListener('error', function() {
  console.log('error from handler');
});
new Promise(function () {
  throw new Error("fail");
}).catch(function (error) {
  setTimeout(() => {throw new Error("Last exception in last chain link")}, 0);
});