Запускать функцию с точным началом каждой секунды (или с определенным количеством миллисекунд каждую секунду) - PullRequest
0 голосов
/ 04 апреля 2019

Я хотел бы запускать функцию в начале каждой секунды.

Со следующим:

function loop() {
    console.log('loop', new Date());
}

setInterval(loop, 1000);

Я получаю это: (работает с узлом v11.13.0)

> node loop.js
loop 2019-04-04T17:37:24.198Z
loop 2019-04-04T17:37:25.222Z
loop 2019-04-04T17:37:26.228Z
loop 2019-04-04T17:37:27.229Z
loop 2019-04-04T17:37:28.230Z
loop 2019-04-04T17:37:29.231Z
loop 2019-04-04T17:37:30.235Z
loop 2019-04-04T17:37:31.239Z

Вы можете видеть, что в каждом цикле число миллисекунд смещается примерно на 200 мс, и оно увеличивается на несколько миллисекунд в каждой итерации.

В идеале я бы хотел это:

> node loop.js
loop 2019-04-04T17:37:24.000Z
loop 2019-04-04T17:37:25.000Z
loop 2019-04-04T17:37:26.000Z
...

1 Ответ

3 голосов
/ 04 апреля 2019

Один из способов - динамически корректировать время ожидания до следующего вызова, например:

function loop() {
    let now = new Date();
    let millis = now.getMilliseconds();
    console.log('loop', now, now.getMilliseconds());

    setTimeout(loop, 1000 - millis)
}

loop();

Это выводит:

node loop.js
loop 2019-04-04T17:42:55.311Z 311
loop 2019-04-04T17:42:56.022Z 22
loop 2019-04-04T17:42:57.005Z 5
loop 2019-04-04T17:42:58.000Z 0
loop 2019-04-04T17:42:59.001Z 1
loop 2019-04-04T17:43:00.001Z 1

Попробуйте сами:

function loop() {
  let now = new Date();
  let millis = now.getMilliseconds();
  console.log('loop', now, now.getMilliseconds());

  setTimeout(loop, 1000 - millis)
}

loop();

Первый вызов не в начале второго (он случайный), и смещение может изменяться на несколько миллисекунд в следующих итерациях. Но это может быть достаточно хорошо в зависимости от вашего варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...