gpt4 book ai didi

javascript - 为什么 setTimeout 计时器会触发两次?

转载 作者:行者123 更新时间:2023-12-02 16:53:32 25 4
gpt4 key购买 nike

我有一个超时计时器,它根据系统时钟每分钟触发一次。我不明白的是为什么它每分钟发射两次?如果您检查控制台日志,它会触发两次 http://jsbin.com/vises/3/

function runClock() {

var now = new Date();
var timeToNextTick = (60 - now.getSeconds()) * 1000 - now.getMilliseconds();

console.log((60 - now.getSeconds()* 1000)- now.getMilliseconds());
setTimeout(runClock, timeToNextTick);
}

// start it
runClock();

这是控制台日志:

enter image description here

最佳答案

这很可能是 JavaScript 计时器不太准确的问题,您可以尝试这样的方法:
http://fiddle.jshell.net/7ffv00jy/

其中最大的变化是您测试 timeUntilNextTick 是否非常小,那么您应该再等待一分钟(因为您可能只是触发了其中一个事件..)
您还可以设置超时来查找第一分钟,然后让“启动器”函数设置一个间隔。

这是更改后的代码:

function runClock() {
var timeToNextTick = msUntilNextMinuteTick();

if(timeToNextTick < 100)
timeToNextTick += 60*1000; // Add a full minute to this..
console.log(new Date().toString() + ": " + timeToNextTick);
setTimeout(runClock, timeToNextTick);
}

// Separate function, makes it easier to debug
function msUntilNextMinuteTick(){
var now = new Date();
return (60 - now.getSeconds()) * 1000 - now.getMilliseconds();
}

// start it
runClock();

到目前为止它给了我这个:

Wed Oct 15 2014 13:36:22 GMT+0200 (W. Europe Summer Time): 37035   
Wed Oct 15 2014 13:37:00 GMT+0200 (W. Europe Summer Time): 59790
Wed Oct 15 2014 13:38:00 GMT+0200 (W. Europe Summer Time): 59789
Wed Oct 15 2014 13:39:00 GMT+0200 (W. Europe Summer Time): 59789
Wed Oct 15 2014 13:40:00 GMT+0200 (W. Europe Summer Time): 59789

(这里重要的部分是开头的日期时间,除了“starter”之外,所有内容都以 :00 秒结束(如果您打印 ms 部分,它们可能全部)以 .00000 结尾))

关于javascript - 为什么 setTimeout 计时器会触发两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26381366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com