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

Discord bot更新presence动态显示服务器数量 无需双setInterval方案问询

关于多定时器的合理性

不必要的定时器确实是不推荐的做法,原因如下:

  • 额外的定时器会占用不必要的内存与事件循环资源,虽然单个定时器开销极低,但冗余逻辑积累后会提升项目后期的维护成本
  • 多定时器不同步容易引发逻辑异常,比如你当前的方案中如果10秒切换状态的定时器触发时,10分钟更新公会数的定时器还未执行,极端场景下会出现短暂的数值不一致。此外你当前的代码还存在语法错误:"!help",, 多写了一个逗号,会导致数组出现空元素。

单定时器实现方案

完全可以仅用单个定时器实现同等效果,而且不需要单独定时更新公会数量,只需要在每次挑选活动状态时,动态计算最新的公会数即可,这样获取的数值永远是实时的,比间隔10分钟更新的方案准确率更高:

setInterval(() => {
    // 每次生成活动列表时都读取最新的公会数量
    const activities = [
        "!help",
        `on ${client.guilds.cache.size} servers`
    ];
    const randomIndex = Math.floor(Math.random() * activities.length);
    client.user.setActivity(activities[randomIndex]);
}, 10000);

如果你确实需要降低公会数的读取频率(比如超大型bot接入数十万公会的场景),也可以在单定时器内增加执行计数,每累计执行对应次数后再更新一次公会数,不需要额外启动定时器:

let guildCount = client.guilds.cache.size;
let executionTimes = 0;

setInterval(() => {
    // 每执行60次(10秒 * 60 = 10分钟)更新一次公会数量
    if (executionTimes % 60 === 0) {
        guildCount = client.guilds.cache.size;
    }
    const activities = [
        "!help",
        `on ${guildCount} servers`
    ];
    const randomIndex = Math.floor(Math.random() * activities.length);
    client.user.setActivity(activities[randomIndex]);
    executionTimes++;
}, 10000);

内容的提问来源于stack exchange,提问作者Jorge Montejo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:30:01