我一直在尝试使异步函数的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在do2()中并包装await this.do3();,则上面的示例很好用)。谢谢!

编辑:更明确一点,如果我从do1()中取出try / catch并将其放在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); }
}

最佳答案

async do1() {
    try {
        await this.do2();
    }
    catch(reason) {
        console.error(reason);
    }
}


do2是一个异步函数。而您不带await调用它。因此,完成后,周围没有try-catch子句。

有关更多详细信息,请参见this questionthis article

10-06 03:51