【发布时间】:2020-07-02 09:19:16
【问题描述】:
我正在尝试编写一个不和谐的机器人,用户可以设置提醒,但是,我不确定最有效的方法是什么。
我最初的想法是基于
方法一——设置间隔
var events = [
//difference datetime
]
setInterval(() => check(), 60000); //Everyminutes)
function check(){
events.forEach(event =>{
if (Date.now() >= event.time){/*do somthing */}
})
}
但是,我不确定这是否是最好的方法,所以我决定尝试使用setTimeout,类似这样。
方法2 - 设置超时
var events = [
//difference datetime
]
bot.on('ready', ()=>{
events.forEach(event=>{
setTimeout( /*do somthing */, event.time)
})
}
只是想知道,方法 1 更好吗? setInterval 和 setTimeout 是最好的方法,还是有其他方法或 api/library 可以使它更有效? (还是差太小)
【问题讨论】:
-
if (Date.now() == event.time){/*do somthing */}this 在大多数情况下都不起作用,因为您很容易错过 event.time 的精确毫秒。最好改用>=。 -
@ErichKitzmueller 感谢您的注意,我在实际代码中这样做了,忘记在此处使用 >=。
-
setTimeout的缺点是当你的代码崩溃时,提醒会丢失。setInterval的缺点是,如果您的检查逻辑很复杂,您就是在浪费周期,但这是我个人会采用的方法。保持逻辑简单,每秒检查一次。 (就像不要每秒打开一个数据库连接来执行 SQL 查询......) -
@TinNguyen 在崩溃的情况下丢失提醒的问题并不存在。在启动时,无论如何您都必须设置这些超时,无论启动是在崩溃之后还是在出于任何原因定期关闭之后发生。但是使用 setInterval 并每秒检查一次列表,你就会遇到一个新问题:一旦触发了事件处理,你必须确保下一秒不要再次启动它。如果您在成功完成后执行此操作,并且任务在某种程度上是异步的,那可能为时已晚,它会被处理两次......
-
... 但是如果您在调用后立即将事件设置为“完成”,并且服务器在实际处理过程中崩溃,它永远不会被完全处理。当然,这可以得到缓解,但它会很快变得复杂,并且始终是问题的潜在根源。
标签: javascript discord discord.js settimeout setinterval