无限循环来检查时间

时间:2018-06-04 15:25:33

标签: javascript node.js optimization time infinite-loop

比方说,我想在每天8:03创建一个调用console.log()的代码。我试图用无限循环编写类似的东西(事实上它是一个每2秒调用一次的函数),它检查是否

timeNow is >= timeToConsoleLog

并在条件满足时调用console.log(),然后递增timeToConsoleLog

代码有效,但我发现它非常难看,我想知道如何以更漂亮的方式实现这样的事情。

由于

4 个答案:

答案 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.');
});

更多信息:https://hackernoon.com/nodejs-javascript-cron-cron-jobs-cronjob-reactjs-scheduler-schedule-example-tutorial-25bcbe23bc6b

答案 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();
相关问题