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
相关产品推荐
相关产品推荐

