我想在每秒开始时运行一个函数。
具有以下内容:
return theXmlMapper.readValue(resultPayload, Result.class);
我得到了:(与节点v11.13.0一起运行)
function loop() {
console.log('loop', new Date());
}
setInterval(loop, 1000);
您可以看到,在每个循环中,毫秒数偏移了大约200毫秒,并且每次迭代都增加了几毫秒。
理想情况下,我希望这样做:
> 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
答案 0 :(得分: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();
第一次调用不是在第二次开始时进行(它是随机的),并且在随后的迭代中,偏移量可能会变化几毫秒。但这可能已经足够好了,具体取决于您的用例。