Бесконечный цикл для проверки времени - PullRequest
0 голосов
/ 04 июня 2018

Скажем, например, я хочу создать код, который будет вызывать console.log() что-то в 8:03 каждый день.Я пытался закодировать что-то подобное, используя бесконечный цикл (фактически это функция, которая вызывает себя каждые 2 секунды), которая проверяет, если

timeNow is >= timeToConsoleLog

, и вызывает console.log(), когда условие выполнено, тогдаприращения timeToConsoleLog.

Код работает, но я нахожу его очень уродливым, я хочу несколько советов о том, как я могу реализовать такую ​​вещь более красивым способом.

Спасибо

Ответы [ 4 ]

0 голосов
/ 04 июня 2018

Вам нужно рассчитать время ожидания до следующего раза, когда должна быть вызвана функция.

        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();
0 голосов
/ 04 июня 2018

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

0 голосов
/ 04 июня 2018

Вам просто нужно рассчитать первый интервал, остальное просто:

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"));
0 голосов
/ 04 июня 2018

Вы можете использовать пакет node-schedule , который позволяет планировать события в стиле 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)
...