You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

关键修改点

  1. 将smsg声明为async函数:因为函数内部使用了await,必须标记为async才能生效。
  2. 替换forEach为for...of:实现异步操作的顺序执行,确保上一条消息处理完成(包括延迟)后,再处理下一条。
  3. 调整计数变量作用域:把currnum移到循环外部,避免每次循环重置,实现正确的累计计数。
  4. 简化计数逻辑:直接用currnum++替代原代码中冗余的变量赋值。

内容的提问来源于stack exchange,提问作者burst is live

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:48:11