等待通过调用调用的异步函数或使用Babel应用

krl*_*krl 5 javascript async-await babeljs ecmascript-next

我如何awaitasync函数调用callapplyBabel

下面是一个示例,其中getOrders是类的async方法Service:

class Service() {
   async getOrders(arg1, arg2, arg3) {
      return await this.anotherService.getOrders(arg1, arg2, arg3);
   }
}

let service = new Service();
// ...
// Babel doesn't compile 
// let stream = await service.getOrders.call(this, arg1, arg2, arg3);
// producing SyntaxError: Unexpected token for await
let stream = service.getOrders.call(this, arg1, arg2, arg3);
stream.pipe(res); // obviously not working without await in the prev line
Run Code Online (Sandbox Code Playgroud)

更新/解决方案

问题在于await常规函数中的匿名函数.而不是标记匿名函数async,我做了一个导致Babel的常规函数call.

感谢@loganfsmyth带领我找到解决方案.

log*_*yth 6

Anasync function返回一个 Promise,并await接受一个Promise 。不需要async通过 await 调用所有函数。如果你想在标准的 JS 函数中使用异步函数,你可以直接使用 result 承诺。在你的情况下,调用一个函数 with.call仍然会像任何其他函数一样返回一个承诺,所以你会通过这个承诺等待:

async function doThing(){
  let service = new Service();

  var stream = await service.getOrders.call(this, arg1, arg2, arg3)
  stream.pipe(res);
}
Run Code Online (Sandbox Code Playgroud)