Как я могу вызвать глобальный обработчик 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);
});

Другие вопросы по тегам