我在这里得到了这段代码:
var date = new Date();
setTimeout(function(e) {
var currentDate = new Date();
if(currentDate - date >= 1000) {
console.log(currentDate, date);
console.log(currentDate-date);
}
else {
console.log("It was less than a second!");
console.log(currentDate-date);
}
}, 1000);
在我的电脑上,它总是正确执行,控制台输出为 1000。有趣的是,在其他计算机上,相同的代码,超时回调在不到一秒的时间内启动,并且差异currentDate - date
介于 980 和 998 之间。
我知道存在解决此错误的库(例如,Tock https://github.com/mrchimp/Tock).
基本上,我的问题是:原因是什么因为setTimeout
在给定的延迟时间内不触发?难道是计算机太慢而浏览器自动尝试适应缓慢并触发之前的事件?
PS:下面是在 Chrome JavaScript 控制台中执行的代码和结果的屏幕截图:
它不应该特别准确。有许多因素限制了浏览器执行代码的速度;引用自MDN https://developer.mozilla.org/en-US/docs/Web/API/Window.setTimeout#Notes:
除了“限制”之外,当页面(或操作系统/浏览器本身)忙于其他任务时,超时还可以稍后触发。
换句话说,这样的方式setTimeout
通常是实现的,它只是为了在给定的延迟后执行,and一旦浏览器的线程空闲就可以执行它。
然而,不同的浏览器可能以不同的方式实现它。以下是我所做的一些测试:
var date = new Date();
setTimeout(function(e) {
var currentDate = new Date();
console.log(currentDate-date);
}, 1000);
// Browser Test1 Test2 Test3 Test4
// Chrome 998 1014 998 998
// Firefox 1000 1001 1047 1000
// IE 11 1006 1013 1007 1005
也许 Chrome 中的 Date类型,或者 Chrome 可能使用不同的策略来决定何时执行代码 - 也许它试图将其放入最近的时间段,即使超时延迟尚未完成。
简而言之,你不应该使用setTimeout
如果您期望可靠、一致、毫秒级的计时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)