繁体   English   中英

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

[英]Await on an async function called with call or apply with Babel

如何awaitasync函数调用, callapplyBabel

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

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

async function返回Promise, await接受promise。 不要求通过await调用所有async函数。 如果要在标准JS函数中使用异步函数,则应直接使用结果promise。 在你的情况下,用.call调用一个函数仍然会像任何其他函数一样返回一个promise,所以你要传递这个promise来等待:

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

  var stream = await service.getOrders.call(this, arg1, arg2, arg3)
  stream.pipe(res);
}

从 OP

问题是let stream = service.getOrders.call(this, arg1, arg2, arg3); 位于常规函数内的匿名函数中。 我没有将匿名函数标记为async ,而是为导致 Babel SyntaxError: Unexpected token的常规函数​​这样做。

感谢@loganfsmyth 引导我找到解决方案。

你可以尝试这样的包装:

class Service() {
   async getOrders(arg1, arg2, arg3) {
   // ....
   };
   wrappedOrders(arg1, arg2, arg3) {
       let res = await getOrders(arg1, arg2, arg3);
       return res;
   }
}

并以这种方式调用wrappedOrders:

let stream = service.wrappedOrders.call(this, arg1, arg2, arg3);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM