2015-05-19 46 views
-1

我正在寻找一种有效的(非连续轮询)方式来在实时时钟转换到新分钟时执行函数。我当前的代码使用setInterval每60秒调用一次函数 - 但实际上有一些滞后,函数调用的平均时间大约为60.2秒。这导致了我正在开发的一个过程监控系统中累积的累积错误。Javascript函数在实时时钟上执行新分钟

有没有人有一个聪明的代码,以实时时钟触发的定期调用函数?

编辑:我被告知通过检查每次调用函数的时间和补偿下一次调用的setInterval值来补偿错误的方法。这让我更加接近 - 但我真正追求的是一种根据实时时钟在新分钟开始时调用功能的方法...

+0

[setInterval时间慢慢偏离保持准确]的可能重复(http://stackoverflow.com/questions/8173580/setinterval-timing-slowly-drive-away-from-staying-accurate) – Josh

+0

pos sible重复的[如何在JavaScript中创建一个精确的计时器?](http://stackoverflow.com/q/29971898/1048572) – Bergi

回答

2

是的,如果您使用setInterval并带有间隔如你所见,它最终会开始漂移。但是,您不必持续不断地进行调查:您只需使用链接电话setTimeout即可。每个人都按照时钟检查自己。有时超时会是59999,有时候会是59997等等,但是它总会和时钟保持一致。

function everyMinuteOnTheMinute() { 
    setTimeout(function() { 
     var d = new Date(); 
     console.log(d.getMinutes() + " (" + d.valueOf() % 1000 + ")"); 
     // your "every minute" code goes here 
     everyMinuteOnTheMinute(); 
    }, 60000 - Date.now() % 60000); 
} 

您可以通过添加回调变成一个一般效用:

function everyMinuteOnTheMinute(cb) { 
    setTimeout(function() { 
     cb(); 
     everyMinuteOnTheMinute(cb); 
    }, 60000 - Date.now() % 60000); 
} 

然后当你有一些代码,你需要运行在分每分钟,只需要使用效用函数:

everyMinuteOnTheMinute(function() { 
    console.log("Whee, I'm happening every minute on the minute!"); 
}); 
+1

'everyMinute'不是一个函数...你的意思是递归调用一些东西吗? – Bergi

+0

是的,我做了,谢谢你的收获,Bergi。我决定重命名它,以便它更加明确('everyMinute'不一定意味着“一分钟”),但忘记更改调用, –

+0

另一个好的抓点,Bergi!你让我停留在脚趾上。 –