Как я могу вызвать глобальный обработчик onError через собственный Promise при возникновении ошибки во время выполнения?
С помощью Q.js я могу вызвать window.onerror с помощью.done():
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 (...)" в ".catch" - это один из самых простых способов воспроизвести ошибку во время выполнения. В действительности это может быть другой аналог ошибки времени выполнения (EvalError, SyntaxError, TypeError и т. Д.), Например:
var a = [];
a(); // Uncaught TypeError: a is not a function
Использование.done является примером, чтобы объяснить мою цель более подробно. У меня нет цели дублировать API .done.
Моя задача: у меня есть цепочка обещаний и обработчик в window.onerror. Все ошибки внутри цепочки я могу обработать с помощью .cath, кроме ошибок времени выполнения в конце цепочки. Когда в конце цепочки методов обещания возникает какое-либо исключение во время выполнения, мне нужно иметь запущенный обработчик, который был повешен на window.onerror.
Ограничения: только нативный JS, должен использовать window.onerror.
Каков наилучший способ вызвать этот глобальный обработчик через встроенный Promise?
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);
});