7

如何await使用with或withasync调用函数?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
4

3 回答 3

9

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

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

  var stream = await service.getOrders.call(this, arg1, arg2, arg3)
  stream.pipe(res);
}
于 2015-06-17T15:02:45.500 回答
0

来自 OP

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

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

于 2019-09-26T18:09:46.813 回答
-4

您可以尝试这样的包装器:

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);
于 2015-06-17T14:28:26.850 回答