Javascript 如何在ANTLR访问者或侦听器的方法上使用async/await编写它们?

Javascript 如何在ANTLR访问者或侦听器的方法上使用async/await编写它们?,javascript,async-await,antlr4,Javascript,Async Await,Antlr4,我正在创建一个语法来将解析器编译为JavaScript解析器 然后我想使用async/await在访问者或侦听器中调用异步函数 由于默认生成的代码在函数中不包含async,因此不允许等待 这是如何实现的?您不能使用异步定义侦听器,因为侦听器方法不能返回任何内容(或者更确切地说,它们的返回值不被使用),所以无法对返回的承诺执行任何操作 但是,在访问者中使用async,效果非常好。只需将您的visitFoo方法定义为async,并使用wait即可。例如: class Interpreter exte

我正在创建一个语法来将解析器编译为JavaScript解析器

然后我想使用async/await在访问者或侦听器中调用异步函数

由于默认生成的代码在函数中不包含async,因此不允许等待


这是如何实现的?

您不能使用
异步
定义侦听器,因为侦听器方法不能返回任何内容(或者更确切地说,它们的返回值不被使用),所以无法对返回的承诺执行任何操作

但是,在访问者中使用
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的代码生成中