【发布时间】:2017-01-15 13:15:13
【问题描述】:
有了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");
});
"throw new Error(...)" in ".catch" 是重现运行时错误的最简单方法之一。实际上,它可能是运行时错误的另一种模拟(EvalError、SyntaxError、TypeError 等),例如:
var a = [];
a(); // Uncaught TypeError: a is not a function
.done 用法是一个示例,可以更详细地解释我的目标。我没有复制 .done API 的目标。
我的任务是:我在 window.onerror 上有一个 Promise 链和处理程序。我可以通过 .cath 处理链中的所有错误,但链末尾的运行时错误除外。当任何运行时异常发生在 Promise 的方法链末尾时,我需要在 window.onerror 上挂起的触发处理程序。
限制:只有原生JS,必须使用window.onerror。
通过本机 Promise 触发此全局处理程序的最佳方式是什么?
【问题讨论】:
-
.then()处理程序在其中捕获异常并将它们变成被拒绝的承诺。因此,您不能抛出异常并期望它一路走上 ES6 标准承诺的最高级别。 -
您不需要自己触发任何全局错误事件。只需为
unhandledPromiseRejection注册您的错误处理程序! -
不确定,也许Catch all unhandled javascript promise rejections 是一个更好的欺骗目标。
-
"必须使用 window.onerror." - 为什么?你不能用
window.onunhandledrejection= window.onerror吗? -
@A.Mikhailov 最好是
.catch(window.onerror)- 传递错误,不会导致额外的未处理拒绝。
标签: javascript promise q es6-promise globalevent