解决传播多个调用异步函数的问题

时间:2015-05-15 08:52:34

标签: javascript async-await promise ecmascript-7

我一直试图让我的异步函数的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(),如下所示,一切正常:< / p>

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 个答案:

答案 0 :(得分:1)

if (drawPoints.Count > 1)
{
    e.Graphics.DrawLines(pen, drawPoints.ToArray());
}

async do1() { try { await this.do2(); } catch(reason) { console.error(reason); } } 是一个异步函数。你没有do2就叫它。所以,当它完成时,周围没有try-catch条款。

有关详细信息,请参阅this questionthis article