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

时间:2015-06-17 14:18:24

标签: javascript async-await babeljs ecmascript-next

await如何async使用callapply使用Babel调用此功能?

以下是一个示例,其中getOrdersasync类的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

更新/解决方案

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

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

3 个答案:

答案 0 :(得分:4)

async function返回承诺,await接受承诺。不要求通过await调用所有async函数。如果要在标准JS函数中使用异步函数,则应直接使用结果promise。在您的情况下,使用.call调用函数仍将像任何其他函数一样返回一个承诺,因此您可以将该承诺传递给等待:

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

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

答案 1 :(得分:0)

From the OP

  

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

     

感谢@loganfsmyth for leading me解决方案。

答案 2 :(得分:-3)

您可以尝试这样的包装:

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);