setTimeout是否安全,可以在大量时间内安排作业?

我正在编写Node.js中的一个应用程序,这个应用程序需要安排函数在几个小时甚至几天后运行。 目前,我正在做类似这样的事情:

const now = Date.now(); const later = getSomeFutureTimestamp(); setTimeout(function() { // do something }, later - now); 

我想知道是否setTimeout是这个工作的适当工具,或者如果有一个更适合长时间的工具。 有一件事要注意,我不需要很高的精确度; 如果工作在预定时间的几分钟内运行,一切都应该没问题。

setTimeout应该没问题。 如果在执行的时候阻塞代码正在运行,它只会被延迟。 所以setTimeout通常晚了20 毫秒 。 但由于您的保证金是几分钟,所以我不认为这会是一个问题。

但是,我build议存储事件触发的时间戳,并定期检查。 这样,你只有一个定时器在任何给定的时间运行。

您还可以将时间戳保留为绝对时间戳,而不是相对的“未来毫秒”值。 这也可以让你把它们存储在服务器重启之间,你不能在相对的时候轻松的做到这一点。 使用你的代码,排队的工作的唯一logging是有一个计时器在运行。 如果该计时器因任何原因而消失,则会丢失所有已安排工作的logging。

就像是:

 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函数中完成(也可以在添加内容之后对jobs数组进行sorting等)