javascript - 在每秒的确切开始处(或每秒特定的毫秒数)运行一个函数
问题描述
我想在每一秒开始时运行一个函数。
具有以下内容:
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
...
解决方案
一种方法是在下次调用之前动态调整超时,如下所示:
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();
第一次调用不是在第二次的开始(它是随机的),并且在接下来的迭代中偏移量可能会变化几毫秒。但这可能就足够了,具体取决于您的用例。
推荐阅读
- google-app-engine - BigQuery 联合查询的性能如何?
- android - Android Studio 弹出文本
- 3dsmax - 一种盖住洞的方法
- python - 将 np 数组 M 排序为两个集合和数组,使得它们没有共同的元素
- scala - 为什么在尝试使用 ScalaTest 时出现“无法初始化类 org.apache.logging.log4j.LogManager”?
- python - python中Kmeans算法的限制
- reactjs - ReactJs Redux Firestore Cors 政策
- python - 为什么 dataframe 上的 result_type = “expand” 这么慢?
- javascript - 如何在 Asp.net MVC 中使用复选框从数据库中选择数据?
- python - 为什么我的表单没有保存到数据库中?