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

时间:2018-08-01 19:04:50

标签: javascript async-await antlr4

我正在创建一种语法,以将解析器编译为JavaScript解析器。

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

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

这怎么实现?

1 个答案:

答案 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);
    }
}