我正在尝试编写一个非常简单的倒数计时器。起初,似乎已经完成并且工作正常。我很兴奋。但是,经过测试,我意识到30分钟的倒计时似乎永远都需要。所以我调查了一下,发现我的计时器定时为30分钟,在现实世界中,差不多50分钟!
我已经尝试过调试这个东西,却找不到它出错的地方。起初我认为setInterval
可能是负责任的,并且不会在一秒钟的间隔内工作。但我看不到其他人有过这个问题。据说它应该始终有效。并且,在仔细检查时,通过使函数print put ... getSecond()
数据,它看起来确实完美。但是,在某些时候正在增加时间!
我尝试过这种方法。从new Date()
函数获取信息,然后用完成时间戳等减去开始时间戳等等。事情是这应该是一个5-10分钟的代码工作,因此,复杂化它以这种方式击败了目的!
所以我来找你们帮忙!我很快就在this jsFiddle设置了它,让你们尝试一下,希望那里的人能看到故障的位置。
计时器基本上只是显示分钟下降,因为我不希望它计算秒数(经过几秒钟,我发现,挫败了必须在特定时间内完成任务的人)。我已经取消隐藏秒,所以你们可以看到它们。它应该打印出它开始的时间和结束的时间,这样你就可以看到设置倒计时的时间与倒计时结束所需的实际时间之间的差异。例如,如果一个人尝试1分钟的倒计时,则应该找到一到两秒的时间。如果一个人尝试30分钟的倒计时,就应该找到大约50分钟的时间。
答案 0 :(得分:1)
解决方案就像你说的那样,它并不复杂,使用开始日期和跟踪new Date()
的差异,我不确定我是否理解基础登录但是:
new Date()
使用系统时钟,这是准确的SetInterval
使用无法预测的时差,因为命令在dirrefent计算机中占用不同的时间,我相信即使是空的setInterval(我的意思是function (){}
)也需要比它应该花费的时间间隔更长的时间但是这个答案及其显示的代码(请参阅注释中的小提琴)使我对setInterval的假设成为假。
答案 1 :(得分:1)
起初我想也许setInterval负责而不是 以恰好一秒的间隔工作
是的,您不能指望它每秒都会激活 ,因为计时器基于本地系统时钟周期。例如:如果在系统上,33毫秒= 1个时钟周期=> 1000秒几乎是30.3个时钟周期,但系统必须将值向上舍入并每31个时钟周期触发一次事件。这就是时间加起来的方式。
由于javascript是单线程的, 执行你的计时器回调 还有另一个开销
答案 2 :(得分: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);