[英]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.