栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在JavaScript中创建准确的计时器?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在JavaScript中创建准确的计时器?

为什么不准确?

因为您正在使用setTimeout()或setInterval()。他们不能被信任,没有针对他们的准确性保证。它们被允许 任意滞后,并且它们不能保持恒定的步伐而是趋向于漂移(如您所观察到的)。

如何创建准确的计时器?

使用该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

现在,这可能会出现值跳跃的问题。当间隔滞后一点,并执行后回调

990
1993
2996
3999
5002
毫秒,你会看到第二计
0
1
2
3
5
(!)。因此,建议更频繁地进行更新(例如大约每100毫秒一次),以免发生此类跳跃。

但是,有时您确实需要一个稳定的时间间隔来执行回调而不会产生偏差。尽管它的收益很高(并且注册的超时时间更少),但这需要更具优势的策略(和代码)。这些被称为
自调整 计时器。与预期的时间间隔相比,此处每个重复超时的确切延迟都适合于实际经过的时间:

var interval = 1000; // msvar 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}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/382323.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号