Javascript 如何在ANTLR访问者或侦听器的方法上使用async/await编写它们?
我正在创建一个语法来将解析器编译为JavaScript解析器 然后我想使用async/await在访问者或侦听器中调用异步函数 由于默认生成的代码在函数中不包含async,因此不允许等待Javascript 如何在ANTLR访问者或侦听器的方法上使用async/await编写它们?,javascript,async-await,antlr4,Javascript,Async Await,Antlr4,我正在创建一个语法来将解析器编译为JavaScript解析器 然后我想使用async/await在访问者或侦听器中调用异步函数 由于默认生成的代码在函数中不包含async,因此不允许等待 这是如何实现的?您不能使用异步定义侦听器,因为侦听器方法不能返回任何内容(或者更确切地说,它们的返回值不被使用),所以无法对返回的承诺执行任何操作 但是,在访问者中使用async,效果非常好。只需将您的visitFoo方法定义为async,并使用wait即可。例如: class Interpreter exte
这是如何实现的?您不能使用
异步
定义侦听器,因为侦听器方法不能返回任何内容(或者更确切地说,它们的返回值不被使用),所以无法对返回的承诺执行任何操作
但是,在访问者中使用async
,效果非常好。只需将您的visitFoo
方法定义为async
,并使用wait
即可。例如:
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(命令)
只返回This.visitSleep(命令)
(或任何其他适用的方法)的结果,这将是一个承诺。因此,您正在等待visitSleep返回的承诺,一切都很顺利
请注意,当方法为async
时,不应使用默认的visitChildren
方法,因为该方法将访问所有子级,而不会等待它们。您可以轻松定义自己的版本,但:
async visitChildren(ctx) {
for(let child of ctx.children) {
await this.visit(child);
}
}
即使侦听器方法不返回值,它们也可以使用wait执行。我将研究如何将其添加到ANTLR4的代码生成中