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

Javascript 为什么setTimeout计时器会触发两次?,javascript,timer,Javascript,Timer,我有一个超时计时器,根据系统时钟按分钟启动。我不明白的是为什么它每分钟发射两次?如果您检查控制台日志,它会触发两次 这是控制台日志: 这很可能是javascript计时器不太准确的问题,您可以尝试以下方法: 最大的变化是,您要测试直到下一次的时间是否很短,然后您应该再等一分钟(因为您可能刚刚触发了其中一个事件) 您还可以有一个超时来查找第一分钟,然后让“starter”函数设置一个间隔 以下是更改后的代码: function runClock() { var timeToNextTic

我有一个超时计时器,根据系统时钟按分钟启动。我不明白的是为什么它每分钟发射两次?如果您检查控制台日志,它会触发两次

这是控制台日志:


这很可能是javascript计时器不太准确的问题,您可以尝试以下方法:

最大的变化是,您要测试直到下一次的时间是否很短,然后您应该再等一分钟(因为您可能刚刚触发了其中一个事件)
您还可以有一个超时来查找第一分钟,然后让“starter”函数设置一个间隔

以下是更改后的代码:

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

(这里重要的部分是开始时的日期时间,除了“开始”之外,所有的结束时间都是:00秒(如果你打印ms部分,它们可能会而不是都以.00000结束))

@Easy这在JS中是一种非常常见的做法,它没有什么错,可能是以59.59秒的速度发射,请务必意识到,您记录到控制台的表达式与您用于计算
timeToNextTick
的表达式不同,我非常确定事件循环的性质将阻止它按照您的需要准确执行。
(60-now.getSeconds()*1000)-now.getmillizes()
看起来像是错误的括号经过一些测试后,您的代码即使在重载下也运行得很好!
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