Discord JS如何实现命令延迟 避免多guild消息推送触发速率限制
问题原因
你编写的两段代码存在相同的逻辑问题:循环内注册的所有setTimeout定时器都设置了固定的1000ms延迟,所有定时器会在循环结束后1秒同时触发,自然只能实现所有消息统一延迟1秒发送,无法达到逐次间隔1秒的效果。
推荐解决方案:async/await 异步等待(可读性更高、可控性更强)
这种写法可以保证每条消息发送完成后再等待1秒处理下一个,也方便添加错误处理避免流程中断:
// 定义通用延迟工具函数 const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); // 批量发送逻辑需要放在async异步函数内 async function bulkSendAnnouncement() { let sendCount = 0; // 把公会集合转成数组方便遍历 const guildList = Array.from(data.message.client.guilds.cache.values()); for (const guild of guildList) { sendCount++; // 仅当符合发送条件时推送消息 if (guild.id && guild.systemChannel && guild.systemChannel.permissionsFor(guild.me).has("SEND_MESSAGES")) { try { // 等待消息发送完成 await guild.systemChannel.send({ // 注:Discord JS v13及以上版本使用embeds数组格式,v12及以下可改回原有的embed字段 embeds: [{ color: 9514728, description: `${data.announcement.message}`, footer: { text: "This is a test message" }, title: `${data.announcement.title}` }] }); console.log(`Embed Message ${sendCount} Sent to guild ${guild.id} - ${guild.name}`); } catch (sendErr) { // 单个公会发送失败不中断整体流程 console.error(`推送至公会 ${guild.id}(${guild.name})失败:`, sendErr); } } // 无论本次是否发送成功,都等待1秒再处理下一个公会 await sleep(1000); } } // 调用执行批量发送 bulkSendAnnouncement();
替代解决方案:动态调整定时器延迟
如果你不想使用async/await语法,也可以给每个定时器设置随索引递增的延迟,实现间隔效果:
let sendCount = 0; Array.from(data.message.client.guilds.cache.values()).forEach((guild, index) => { // 第1个任务立即执行,第2个延迟1秒,第3个延迟2秒,依次类推 setTimeout(async () => { sendCount++; if (guild.id && guild.systemChannel && guild.systemChannel.permissionsFor(guild.me).has("SEND_MESSAGES")) { try { await guild.systemChannel.send({ embeds: [{ color: 9514728, description: `${data.announcement.message}`, footer: { text: "This is a test message" }, title: `${data.announcement.title}` }] }); console.log(`Embed Message ${sendCount} Sent to guild ${guild.id} - ${guild.name}`); } catch (sendErr) { console.error(`推送至公会 ${guild.id}(${guild.name})失败:`, sendErr); } } }, index * 1000); });
额外注意事项
- 若你使用的是Discord JS v12及更早版本,把代码中的
embeds数组字段替换为你原有写法的embed对象字段即可正常运行 - 1秒的发送间隔针对500个公会总耗时约8~9分钟,完全符合Discord平台速率限制要求,不会触发限流惩罚
内容的提问来源于stack exchange,提问作者Liam Moore
相关产品推荐
相关产品推荐

