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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 06:06:05