首页 > web前端 > js教程 > 为什么 JavaScript 的 `setTimeout()` 和 `setInterval()` 不准确,如何创建更精确的计时器?

为什么 JavaScript 的 `setTimeout()` 和 `setInterval()` 不准确,如何创建更精确的计时器?

Patricia Arquette
发布: 2024-12-13 14:52:12
原创
497 人浏览过

Why Are JavaScript's `setTimeout()` and `setInterval()` Inaccurate, and How Can I Create a More Precise Timer?

准确的 JavaScript 计时器:分析

许多开发人员通常使用 setTimeout() 或 setInterval() 方法来创建计时器。然而,这些方法缺乏准确性保证。他们可能会遇到任意滞后,偏离预期的速度。

不准确的原因

固有的问题源于 setTimeout() 和 setInterval() 使用的机制。这些函数依赖于浏览器的事件循环,不能保证以一致的时间间隔执行。实际执行时间可能会因浏览器负载、系统资源和其他因素而异。

创建准确的计时器

要解决此问题,开发人员应该利用Date 对象获取准确(毫秒精度)的时间戳。随后,他们的逻辑应该基于当前时间值,而不是依赖于执行计数。

对于简单的计时器或时钟,显式维护时间差是一种可行的方法:

var start = Date.now();
setInterval(function() {
    var delta = Date.now() - start; // milliseconds elapsed since start
    // ...
    // Output in seconds
    console.log(Math.floor(delta / 1000));
}, 1000);
登录后复制

然而,由于间隔执行中的潜在滞后,该技术可能会导致值跳跃。为了缓解这种情况,开发人员可以考虑更频繁地更新间隔,例如每 100 毫秒更新一次。

高级技术:自我调整计时器

对于没有漂移的稳定间隔,自我调整定时器- 调整计时器提供了先进的解决方案。这些计时器根据实际经过的时间动态调整后续执行之间的延迟:

var interval = 1000; // ms
var expected = Date.now() + interval;
setTimeout(step, interval);
function step() {
    var dt = Date.now() - expected; // drift
    if (dt > interval) {
        // Handling severe drift here
    }
    // ... Perform desired action

    expected += interval;
    setTimeout(step, Math.max(0, interval - dt)); // Adjust delay to correct for drift
}
登录后复制

以上是为什么 JavaScript 的 `setTimeout()` 和 `setInterval()` 不准确,如何创建更精确的计时器?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板