0

我正在尝试编写一个非常简单的倒数计时器。起初,它似乎已经完成并且工作正常。我很兴奋。但是,经过测试,我意识到 30 分钟倒计时似乎永远需要。所以我查看了一下,发现我的计时器计时为 30 分钟,在现实世界中,几乎是 50 分钟!

我试过调试这个东西,但找不到哪里出错了。起初我认为这可能setInterval是负责任的,而不是在一秒钟的时间间隔内工作。但我看不到其他人有这个问题。据说它应该始终有效。而且,当仔细检查它时,通过使功能 print put ... getSecond()data 它看起来确实工作得很好。但是,在某个时候正在添加时间!

我已经尝试过这种方法。从new Date()函数中获取信息,然后用结束时间戳减去起始时间戳......等等等等。问题是这应该是一个 5-10 分钟的代码工作,因此,以这种方式使其复杂化失败目的!

所以我来找大家帮忙!我已经在这个 jsFiddle中快速设置了它,供你们试用,希望有人能看到故障在哪里。

计时器基本上只是显示分钟数减少,因为我不希望它计算秒数(我发现秒数的流逝会让必须在特定时间完成任务的人感到沮丧)。不过,我已经取消隐藏秒数,所以你们可以看到它们。它应该打印出开始时间和结束时间,这样您就可以看到设置倒计时的时间与倒计时结束的实际时间之间的差异。例如,如果尝试 1 分钟倒计时,应该会发现增加了 1 秒或 2 秒。如果尝试 30 分钟倒计时,应该会发现大约增加了 50 分钟。

4

3 回答 3

1

解决方案如您所说,一点也不复杂,使用开始日期并跟踪差异new Date(),我不确定我是否非常了解底层登录,但是:

  • new Date()使用系统时钟,准确
  • SetInterval使用无法预测的时间差异,因为命令在不同的计算机中花费不同的时间,我相信即使是空的 setInterval (我的意思是function (){})也会花费比它应该花费的时间间隔更长的时间。

- 编辑 -

但是这个答案和它显示的代码(见评论中的小提琴)使我对 setInterval 的假设为假。

于 2013-08-17T01:28:36.030 回答
1

起初我认为 setInterval 可能是负责任的,并且没有以一秒的间隔工作

是的,你不能指望它每秒准确地触发一次,因为定时器是基于本地系统时钟周期的。例如:如果在系统上,33 毫秒 = 1 个时钟周期 => 1000 秒几乎是 30.3 个时钟周期,但系统必须将值四舍五入并每 31 个时钟周期触发一次事件。时间就是这样加起来的。

由于 javascript 是单线程的,因此执行计时器回调会涉及另一个开销

于 2013-08-17T01:42:02.857 回答
0

如前所述,您必须定期修复计算的时间,这可以通过使用 setInterval 来完成:

var update = function () {
    time = Date.now() - startTime;
    console.log(time);
    if (time >= duration) {
        window.clearInterval(intervalObj);
    }
};


var startTime = Date.now(),
    time,
    duration = 10000, // Set the duration here.
    updateInterval = 1000, // The time interval between updates determines the accuracy.
    intervalObj = window.setInterval(update, updateInterval);
于 2017-05-20T00:45:50.957 回答