在每秒的确切开始处运行一个函数(或每秒特定的毫秒数)

问题描述 投票:0回答:1

我想在每一秒开始运行一个函数。

具有以下内容:

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
...
javascript node.js settimeout scheduling
1个回答
3
投票

一种方法是在下次调用之前动态调整超时,如下所示:

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();

第一次调用不在第二次调用的开头(它是随机的),并且在以下迭代中偏移量可能会有几毫秒的变化。但根据您的使用情况,这可能已经足够了。

© www.soinside.com 2019 - 2024. All rights reserved.