Разрешает распространение нескольких вызывающих асинхронных функций
Я пытался получить reject
из моих асинхронных функций, чтобы вернуться к своим вызывающим, но по какой-то причине это не работает. Вот несколько примеров кода:
"use strict";
class Test {
constructor() {
this.do1();
}
async do1() {
try { this.do2(); } catch(reason) { console.error(reason); }
}
async do2() {
for(let i = 0; i < 10; i++) {
await this.do3();
console.log(`completed ${i}`);
}
console.log("finished do1");
}
async do3() {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(Math.random() < 0.3) reject('###rejected');
else resolve("###success");
}, 1000);
});
}
}
export default Test;
Chrome просто дает мне это каждый раз: Unhandled promise rejection ###rejected
,
Есть идеи, почему это происходит? Я хотел бы иметь возможность обрабатывать все сгенерированные ошибки с более высокого уровня, чем do2()
(приведенный выше пример работает нормально, если попытка / отлов do2()
и обертывания await this.do3();
). Спасибо!
Изменить: чтобы быть немного более явным, если я возьму попробовать / поймать из do1()
и положить его в do2()
следующим образом все работает нормально:
async do2() {
try {
for(let i = 0; i < 10; i++) {
await this.do3();
console.log(`completed ${i}`);
}
console.log("finished do1");
} catch(reason) { console.error(reason); }
}
1 ответ
async do1() {
try {
await this.do2();
}
catch(reason) {
console.error(reason);
}
}
do2
это асинхронная функция И ты называешь это без await
, Так что, когда он завершится, вокруг него не будет предложений try-catch.
Смотрите этот вопрос и эту статью для более подробной информации.