簡體   English   中英

如何使用async / await在其方法上編寫ANTLR訪問者或偵聽器?

[英]How an ANTLR visitor or listener can be written with async/await on its methods?

我正在創建一個語法來將解析器編譯為JavaScript解析器。

然后,我想使用async / await在訪問者或偵聽器中調用異步函數。

由於默認生成的代碼在函數中不包含異步,因此不允許等待。

如何實現呢?

您實際上不能使用async定義偵聽器,因為偵聽器方法無法返回任何內容(或者不使用其返回值),因此返回的promise不會做任何事情。

但是,在訪問者中使用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返回的承諾,並且一切正常。

請注意,當您的方法async時,您不應使用默認的visitChildren方法,因為它將訪問所有子級而無需await它們。 不過,您可以輕松定義自己的版本:

async visitChildren(ctx) {
    for(let child of ctx.children) {
        await this.visit(child);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM