JavaScript对接Telegram API异步场景下如何防止指定代码重复执行
根因分析
问题核心是作用域变量重复声明:
- 外层异步立即执行函数中声明的
greeting属于上层作用域 - 回调函数内部使用
var greeting = true重新声明了局部作用域的同名变量,修改操作仅作用于局部变量,外层的greeting始终未被修改,因此每次触发回调时判断条件始终满足。
同时原代码存在两处语法问题:
new RegExp(foo*)参数非法,foo*未用引号包裹会被解析为未定义变量,运行直接报错- 函数括号未完全闭合,存在语法错误
修复代码
删除回调内部的var声明,直接修改外层作用域的标志位即可:
(async () => { var greeting = false; await telegramListener( async (message) => { const regex = new RegExp("foo*"); if (regex.test(message) && !greeting) { greeting = true; console.log('greeting'); } } ); })();
修复后首次匹配到符合正则的消息时会将greeting设为true,后续所有回调触发时都不会再进入该判断分支,逻辑仅执行一次。
内容的提问来源于stack exchange,提问作者bbruman
相关产品推荐
相关产品推荐

