1

非同期関数の s を呼び出し元にバブルアップさせようとしましたが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()(上記の例は、try/catch が indo2()および wrapsの場合に正常に動作しますawait this.do3();)。ありがとう!

編集:もう少し明確にするために、次のように try/catch を取り出して挿入すると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); }
}
4

1 に答える 1