我在Firefox 12中遇到了一个奇怪的问题。setTimeout()似乎并不总是等待适当的长度。也许是日期毫秒不跳动?
Check out this fiddle.本质上,100ms的setTimeout似乎在80ms至110ms之间的任何位置运行。基于John Resig's explanation of timers,我可以了解更多信息。但是更少?
您可能必须刷新一次或两次才能看到该问题,因为有时在首次运行时它可以正确运行。在IE和Chrome中,它似乎工作得很出色。
这是我在 fiddle 中使用的代码:
var txt = '',
TIMEOUT_LENGTH = 100,
_now;
now = Date.now || function() { return new Date().getTime() };
function log(time) {
c = time < 100? 'class="error"' : '';
$('#log').append('<p '+c+'>waited ' + time + '</p>');
}
function defer() {
var d = $.Deferred(),
start = now();
setTimeout(function() {
d.resolve(now() - start);
}, TIMEOUT_LENGTH);
return d.promise();
}
for (var i = 0; i < 20; i++) {
defer().then(log);
}
这是古怪的输出示例:
这是我的浏览器信息:
非常感谢您阅读我的问题!我希望有人能对此有所启发。
更多信息
我通过使用setInterval()并检查每个增量来查看是否已经过所需时间,从而解决了该问题。 See this fiddle。
但是,我仍然很想知道是否有人可以阐明问题的根源
最佳答案
是的。 setTimeout
的准确性取决于许多因素,不能保证始终在您指定的确切时间执行。
我不能以任何权限说这句话,但是我会冒昧地猜测Firefox,为了使其看起来更快,它将暂时加速JS引擎以使所有内容动起来(这很有趣,因为根据我的经验,它基于计时器实际上,在我的firefox版本中,函数起初运行速度实际上较慢)。
正如您发布的链接所述,setTimeout
和setInterval
都不保证它们会在正确的时间执行。但是,使用setInterval
,您可以利用计时器循环的优势,通过 catch 它的滞后时间来进行“自我校正”,因此对于您尝试执行的任何操作,它都可能更合适。
无论如何,这是我在Macbook 10.6.8上获得的结果:
Firefox 5.0.1:
waited 92
waited 92
waited 93
waited 93
waited 93
waited 93
waited 93
waited 94
waited 93
waited 93
waited 93
waited 93
waited 94
waited 94
waited 94
waited 94
waited 94
waited 95
waited 96
waited 96
Safari 5.1.5:
waited 100
waited 104
waited 104
waited 103
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
Chrome 19.0.1084.52:
waited 101
waited 103
waited 103
waited 104
waited 104
waited 103
waited 103
waited 103
waited 103
waited 103
waited 103
waited 103
waited 103
waited 103
waited 104
waited 104
waited 104
waited 104
waited 104
waited 104
关于javascript - Firefox太早调用setTimeout函数(或Date.getTime()已关闭?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10875370/