我正在创建一种语法,以将解析器编译为JavaScript解析器。
然后,我想使用async / await在访问者或侦听器中调用异步函数。
由于默认生成的代码在函数中不包含异步,因此不允许等待。
这怎么实现?
答案 0 :(得分:1)
您无法真正使用async
定义侦听器,因为侦听器方法无法返回任何内容(或者不使用其返回值),因此返回的诺言将无济于事。
但是,在访问者中使用async
可以很好地工作。只需将visitFoo
方法定义为async
,然后根据需要使用await
即可。例如:
class Interpreter extends MyLangVisitor {
async visitSleep(sleepCtx) {
let p = new Promise(function (resolve) {
setTimeout(resolve, sleepCtx.amount.text)
});
await p;
}
async visitProgram(programCtx) {
for(let command of programCtx.commands) {
await this.visit(command);
}
}
}
这将很好用,因为this.visit(command)
仅返回this.visitSleep(command)
的结果(或任何其他适用的方法),这将是一个希望。因此,您正在等待visitSleep
返回的承诺,一切都会顺利进行。
请注意,当您的方法为visitChildren
时,您不应使用默认的async
方法,因为这将访问所有子级而不会await
对其进行访问。不过,您可以轻松定义自己的版本:
async visitChildren(ctx) {
for(let child of ctx.children) {
await this.visit(child);
}
}