javascript - 如何在 javascript 中创建一个准确的计时器?

标签 javascript time setinterval

我需要创建一个简单但准确的计时器。

这是我的代码:

var seconds = 0;
setInterval(function() {
timer.innerHTML = seconds++;
}, 1000);

恰好 3600 秒后,它打印大约 3500 秒。

  • 为什么不准确?

  • 如何创建准确的计时器?

最佳答案

Why is it not accurate?

因为您正在使用 setTimeout()setInterval()They cannot be trusted ,它们没有准确性保证。 They are allowed to lag任意地,他们不会保持恒定的步伐,而是 tend to drift (正如您所观察到的)。

How can I create an accurate timer?

使用 Date对象而不是获取(毫秒)准确的当前时间。然后将您的逻辑基于当前时间值,而不是计算回调执行的频率。

对于简单的计时器或时钟,明确地跟踪时间差异:

var start = Date.now();
setInterval(function() {
    var delta = Date.now() - start; // milliseconds elapsed since start
    …
    output(Math.floor(delta / 1000)); // in seconds
    // alternatively just show wall clock time:
    output(new Date().toUTCString());
}, 1000); // update about every second

现在,这有可能跳跃值的问题。当间隔稍微滞后并在 990199329963999 之后执行回调时5002 毫秒,你会看到秒数 0, 1, 2, 3, 5(!)。因此,建议更频繁地更新一次,例如大约每 100 毫秒一次,以避免此类跳跃。

但是,有时您确实需要一个稳定的时间间隔来执行您的回调而不会漂移。这需要更高级的策略(和代码),尽管它的返回很好(并且记录的超时更少)。这些被称为自调整计时器。这里,与预期间隔相比,每个重复超时的确切延迟都适应实际耗时:

var interval = 1000; // ms
var expected = Date.now() + interval;
setTimeout(step, interval);
function step() {
    var dt = Date.now() - expected; // the drift (positive for overshooting)
    if (dt > interval) {
        // something really bad happened. Maybe the browser (tab) was inactive?
        // possibly special handling to avoid futile "catch up" run
    }
    … // do what is to be done

    expected += interval;
    setTimeout(step, Math.max(0, interval - dt)); // take into account drift
}

关于javascript - 如何在 javascript 中创建一个准确的计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54831269/

相关文章:

javascript - 使用网络驱动程序清除 Chrome 上的缓存

javascript - .load() 之后的 DOM 操作

c 时间格式

javascript - 当 setInterval() 运行另一个函数时,一个有效的函数突然变为 "not a function"

javascript - 同步两个 Angular ui bootstrap 轮播

javascript - 如何在 Bootstrap 日期时间选择器中获得 15 倍数的时间?

r - ggplot 随着时间的推移每个唯一实例的多线图

r - R : POSIXct error 中的时差

javascript - 如何在与 "clearInterval"不同的 if 语句中使用 "setInterval"

javascript - Node Js 中每个请求之间延迟 5 秒