JavaScript中cari函数匹配成功后sendMessage仍重复执行问题
cari函数运行异常问题
异常现象
- 查询匹配到正确目标数据时,本不该触发的错误提示逻辑仍会执行,导致
sendMessage方法被调用两次:先返回正确的材料查询结果,随后弹出材料不存在或命令不符合规则的错误提示,该异常在数据匹配正确场景下本不应出现。
异常关联错误代码段
txt = 'Material '+pola[1]+' tidak ditemukan atau perintah command tidak sesuai'; sendMessage(cid,txt);
问题复现截图


问题相关完整源码
function cari(cid,cmd){ var txt = ''; var pola = cmd.match(/cari#(.+)/); if (pola[1]!=''){ var rs = bacadata(); for (var i=0;i<rs.length;i++) { if (rs[i][0] == pola[1]){ txt = 'Material '+pola[1]+' adalah '+rs[i][1]; sendMessage(cid,txt); } } txt = 'Material '+pola[1]+' tidak ditemukan atau perintah command tidak sesuai'; sendMessage(cid,txt); } }
根因分析
- 错误提示逻辑位于
for循环外部,与循环体同级,无论循环中是否匹配到目标数据,循环执行结束后都会固定执行错误提示的sendMessage调用,这是匹配成功时重复发消息的直接原因。 - 代码存在额外隐患:若正则
/cari#(.+)/匹配失败,pola值为null,直接访问pola[1]会触发类型错误。
修复方案
- 新增匹配状态标记,遍历完所有数据后,仅在未找到匹配项时才触发错误提示
- 新增正则匹配结果的空值判断,避免空指针报错
- 匹配到目标数据后直接跳出循环,减少不必要的遍历
修复后代码:
function cari(cid,cmd){ var txt = ''; var pola = cmd.match(/cari#(.+)/); if (pola && pola[1] != ''){ var rs = bacadata(); var isMatched = false; for (var i=0;i<rs.length;i++) { if (rs[i][0] == pola[1]){ txt = 'Material '+pola[1]+' adalah '+rs[i][1]; sendMessage(cid,txt); isMatched = true; break; } } if (!isMatched) { txt = 'Material '+pola[1]+' tidak ditemukan atau perintah command tidak sesuai'; sendMessage(cid,txt); } } }
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

