WhatsApp.js中forEach循环延迟仅单次生效的问题求助
WhatsApp Web.js批量消息延迟失效问题解决
问题
我用WhatsApp Web.js开发批量发送消息的机器人,号码存储在number.js文件中。为避免被WhatsApp封禁,计划在循环内添加20秒延迟,让两条消息间隔发送。但实际测试时,只有第一条消息有延迟,后续消息会同时发出,完全达不到间隔效果。
原因
问题出在forEach循环的特性上:forEach会一次性触发所有数组元素对应的异步回调函数,这些函数是并行执行的。也就是说,两个号码的处理逻辑同时启动,各自的await sleep(20000)是同时开始计时的,20秒后两条消息会几乎同时发送,自然没有间隔。
解决方案
用for...of循环替代forEach,for...of可以配合await关键字,确保上一个元素的异步处理完全完成后,再开始下一个元素的处理,从而实现依次间隔发送。同时修正计数变量的作用域问题(原代码中currnum每次循环都会重置,计数逻辑无效)。
修改后的代码
const sleep = ms => new Promise(r => setTimeout(r, ms)) // 将smsg改为async函数,支持内部await const smsg = async () => { let currnum = 1; // 计数变量移到循环外,避免每次重置 // 用for...of遍历数组,确保顺序执行异步操作 for (const item of Numbers) { let final_num = item.substring(1); const messagetosend = "hello"; let getuser = await user.getNumberId(final_num); if (getuser) { await sleep(20000); // 等待20秒后再执行后续操作 currnum++; console.log(currnum); console.log('Message sent to ' + final_num); await user.sendMessage(getuser._serialized, messagetosend); } else { console.log("Number not found"); } } } user.on('message', message => { if (message.body === '!start 2005') { smsg(); } }); user.initialize();
关键修改点
- 将
smsg声明为async函数:因为函数内部使用了await,必须标记为async才能生效。 - 替换
forEach为for...of:实现异步操作的顺序执行,确保上一条消息处理完成(包括延迟)后,再处理下一条。 - 调整计数变量作用域:把
currnum移到循环外部,避免每次循环重置,实现正确的累计计数。 - 简化计数逻辑:直接用
currnum++替代原代码中冗余的变量赋值。
内容的提问来源于stack exchange,提问作者burst is live
相关产品推荐
相关产品推荐

