比方说,我想在每天8:03创建一个调用console.log()
的代码。我试图用无限循环编写类似的东西(事实上它是一个每2秒调用一次的函数),它检查是否
timeNow is >= timeToConsoleLog
并在条件满足时调用console.log()
,然后递增timeToConsoleLog
。
代码有效,但我发现它非常难看,我想知道如何以更漂亮的方式实现这样的事情。
由于
答案 0 :(得分:1)
您可以使用node-schedule
package,它可以让您以cron风格安排活动。
在08:03运行一次函数将如下所示:
const schedule = require('node-schedule');
schedule.scheduleJob('8 3 * * *', yourFunction) // run every day at 08:03
语法如下:
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ │
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)
答案 1 :(得分:0)
node-cron可以在这里提供帮助:
var cron = require('node-cron');
cron.schedule('8 3 * * *', function(){
console.log('8:03 everyday.');
});
答案 2 :(得分:0)
你只需要在第一个间隔时间,其余的很容易:
const DAY = 1000 * 60 * 60 * 24;
function sheduleAt(time, fn) {
const dayBegin = new Date();
dayBegin.setHours(0);
dayBegin.setMinutes(0);
const left = (dayBegin + time - Date.now()) % DAY;
setTimeout(function next() {
fn();
setTimeout(next, DAY);
}, left);
}
可以在以下地址使用:
sheduleAt(12/*h*/ * 60 + 30/*min*/, () => console.log("lunch"));
答案 3 :(得分:0)
您必须在下次调用函数时计算超时。
function callFoo(){
var dateNow = new Date(),
nextDate = new Date(),
timeout = 0;
nextDate.setHours(8);
nextDate.setMinutes(3);
if(dateNow > nextDate){
nextDate = new Date(new Date(nextDate).getTime() + (60 * 60 * 24 * 1000));
}
setTimeout(foo, (nextDate - dateNow));
}
function foo(){
callFoo();
console.log('It\'s time...');
}
callFoo();