【问题标题】:Javascript Effective way to do Event Scheduling,Javascript 进行事件调度的有效方法,
【发布时间】: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


【解决方案1】:

我肯定更喜欢方法 2。

方法 1 必然是精度(关于执行的确切时间)和浪费的 CPU 周期之间的折衷。使用方法 1 的唯一借口是某些事件的执行影响了其他事件的期望开始时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多