Разрешает распространение нескольких вызывающих асинхронных функций

Я пытался получить 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.

Смотрите этот вопрос и эту статью для более подробной информации.

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