[英]Await on an async function called with call or apply with Babel
如何await
在async
函数调用, call
或apply
与Babel
?
下面是一个示例,其中getOrders
是Service
类的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
,而是为导致 BabelSyntaxError: 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.