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

时间:2014-10-15 11:25:27

标签: javascript timer

我有一个超时计时器,可根据系统时钟点亮。我不明白的是它为什么每分钟发射两次?如果您检查控制台日志,则会触发两次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

1 个答案:

答案 0 :(得分:2)

这很可能是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  

(这里的重要部分是开头的日期时间,除了“首发”之外所有结束时间为:00秒(如果你打印ms部分,他们可能全部结束.00000))