await
如何async
使用call
或apply
使用Babel
调用此功能?
以下是一个示例,其中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
更新/解决方案
问题是let stream = service.getOrders.call(this, arg1, arg2, arg3);
在常规函数中的匿名函数中。我没有标记匿名函数async
,而是使用导致Babel SyntaxError: Unexpected token
的常规函数。
感谢@loganfsmyth带领我找到解决方案。
答案 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)
问题是
let stream = service.getOrders.call(this, arg1, arg2, arg3);
在常规函数内的匿名函数中。我没有标记匿名函数async
,而是为引起BabelSyntaxError: 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);