我正在寻找一种有效的(非连续轮询)方式来在实时时钟转换到新的一分钟时执行一个函数。我当前的代码使用setInterval每隔60秒调用一次该函数 - 但实际上有一些滞后,并且该函数平均被调用大约60.2秒。这导致了我正在开发的过程监控系统中累积的累积错误。
有没有人有一个巧妙的代码,可以按实时时钟触发定期调用函数?
编辑:通过检查每次调用函数的时间并补偿下一次调用的setInterval值,我收到了一种补偿错误的方法。这让我更接近 - 但我真正想要的是根据实时时钟在新的一分钟开始时调用函数的方法......
答案 0 :(得分:2)
是的,如果你以1分钟的间隔使用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!");
});