我想在每周日23:59(晚上11点)执行一段代码(基本上是在每个星期结束的时候)。但是,它应该每周只执行一次。
A setInterval()
函数在这里是不行的,因为应用可能会同时被重启。
如果这能帮到你,我有一个基本的想法。
设置一个时间间隔(用
setInterval
),每5-10秒检查一次,并检查是否是周日和23小时(晚上11点)。然而,这个解决方案将不一致,可能会在一周内发射一次以上。我需要一个更防弹的解决方案。
你可以使用任何cron模块(比如 https:/www.npmjs.compackagecron),并将工作设置为 59 23 * * 0
(范围)
const { CronJob } = require('cron');
const job = new CronJob('59 23 * * 0', mySundayFunc);
job.start();
如何计算启动时的剩余时间,就像这段代码一样。
const WEEK_IN_MS = 604800000;
const ONE_HOUR_IN_MS = 3600000;
const FOUR_DAYS_IN_MS = 4 * WEEK_IN_MS / 7;
function nextInterval() {
return WEEK_IN_MS - ((Date.now() + FOUR_DAYS_IN_MS) % WEEK_IN_MS) - ONE_HOUR_IN_MS;
}
const interval = nextInterval();
console.log(`run after ${interval} ms`);
setTimeout(
() => console.log('Do it!!!'),
interval
)