【问题标题】:Javascript function execution on real time clock new minuteJavascript函数在实时时钟新分钟上执行
【发布时间】:2015-05-19 02:56:25
【问题描述】:

我正在寻找一种高效(非连续轮询)的方式来在实时时钟切换到新分钟时执行功能。我当前的代码使用 setInterval 每 60 秒调用一次该函数——但实际上存在一些滞后,并且该函数平均在大约 60.2 秒时被调用。这会导致在我正在开发的过程监控系统中累积错误。

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

编辑:我被提醒一种方法来补偿错误,方法是检查每次调用函数的时间并为下一次调用补偿 setInterval 值。这让我更接近——但我真正追求的是一种在新一分钟开始时根据实时时钟调用函数的方法......

【问题讨论】:

标签: javascript interrupt clock timing


【解决方案1】:

是的,如果您以 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!");
});

【讨论】:

  • everyMinute 不是函数……你的意思是递归调用什么东西吗?
  • 是的,我做到了,谢谢你的收获,Bergi。我决定重命名它以使其更明确(everyMinute 不一定表示“即时”),但忘记更改调用,
猜你喜欢
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2022-01-04
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多