setTimeout对于在很长一段时间内安排作业是否安全?

时间:2015-10-22 16:57:19

标签: javascript node.js timer

我在Node.js中编写一个应用程序,需要安排在未来几小时或有时几天运行的功能。目前,我正在这样做:

(1, 12, 123, 1234, 456, 56, 7, 3456, 234567)

Input = "1234567"

我想知道const now = Date.now(); const later = getSomeFutureTimestamp(); setTimeout(function() { // do something }, later - now); 是否适合这项工作,或者是否有更适合长时间间隔的工具。有一点需要注意的是,我不需要很高的精确度;如果工作在预定时间的几分钟内运行,一切都应该没问题。

1 个答案:

答案 0 :(得分:2)

setTimeout应该没问题。如果阻止代码在其执行意图执行时正在运行,那么它才会真正延迟。所以setTimeout通常晚了20 毫秒。但由于你的保证金是几分钟,我不认为这是一个问题。

但是,我建议存储触发事件的时间戳,并定期检查。这样,您在任何给定时间只能运行1个计时器。

您还可以将时间戳保留为绝对时间戳 - 而不是相对的,"未来的毫秒数"值。这也允许您在服务器重新启动之间存储它们,您可以轻松地在相对时间内执行这些操作。使用您的代码,排队作业的唯一记录是运行的计时器。如果该计时器因任何原因消失,您将丢失已安排的作业的所有记录。

类似的东西:

setTimeout

你只需要开始一次。这可以在function checkForScheduledJobs() { var now = Date.now(), job; // assuming here that the jobs array is sorted earliest to latest while(jobs.length && jobs[0].timestamp < now) { jobs.shift().callback(); } setTimeout(checkForScheduledJobs, 60000); // check each minute } 函数中完成(在向其中添加内容之后也可以对addScheduledJob数组进行排序等)。