当前位置: 首页 > 面试题库 >

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

夏朗
2023-03-14
问题内容

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

这是我的代码:

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

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

  • 为什么不准确?

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


问题答案:

为什么不准确?

因为您正在使用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

现在,这可能会出现值跳跃的问题。当间隔滞后一点,并执行后回调9901993299639995002毫秒,你会看到第二计01235(!)。因此,建议更频繁地进行更新(例如大约每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中的方法多么不可预测。 根据我的经验,在很多情况下计时器都非常不准确。所谓不准确,是指实际延迟时间或多或少地相差250-500ms。尽管这不是很长的时间,但是使用它来隐藏/显示UI元素时,时间显然是显而易见的。 是否有任何技巧可以确保准确执行(无需借助外部API),或者这是一个失败的原因? 问题答案: 是否有任何技巧可以确保准确执行(无需借助外部API

  • 问题内容: 为了准确起见,我喜欢@Tony Docherty On CR建议的逻辑和示例。这是链接。 为了突出显示给定的单词,一次又一次地总是有几微秒的延迟。如果我要突出显示一些单词:“ hello how are”,并且每个单词的值分别(延迟)为:200,300,400 ms,那么计时器实际花费的时间总是更多。说而不是200毫秒,而是216毫秒。像这样,如果我有很多话……最后,额外的延迟是显而易

  • 问题内容: 我正在Windows上的python中进行编程,想准确地测量函数运行所花费的时间。我已经编写了一个函数“ time_it”,该函数需要另一个函数,然后运行它并返回运行时间。 我称其为1000次并取平均值。(最后的1000常数以毫秒为单位给出答案。) 该函数似乎可以正常工作,但是我有一种na不安的感觉,那就是我做错了什么,通过这种方式,我花的时间比函数运行时实际花费的时间更多。 有没有更

  • 问题内容: 我想创建一种秒表,当分钟数达到20分钟时,会弹出一个对话框,该对话框不是问题。但是我的分钟变量在此代码中没有增加。 问题答案: 您可以使用以下方法真正简化整个程序:

  • 问题内容: 我不知道最好的方法是创建具有属性和方法的JavaScript对象。 我看过一些示例,该示例中的人员使用然后在所有功能中使用以确保范围始终正确。 然后,我看到了用于添加属性的示例,而其他示例则是内联的。 有人可以给我一个带有某些属性和方法的JavaScript对象的正确示例吗? 问题答案: 有两种用于在JavaScript中实现类和实例的模型:原型方式和闭包方式。两者都有优点和缺点,并且

  • 问题内容: 我正在打印星空金字塔,我无法打印新行。 问题答案: 使用换行符。 您还可以拥有多个: 但是,如果将其呈现为HTML,则需要将HTML标签用于换行符: 源代码中的字符串如下所示: 该字符串在HTML源代码中将如下所示: HTML页面将以换行符的形式呈现给查看该页面的用户,只是将文本拖放到源代码的下一行(如果在HTML页面上)。