我在 Firefox 12 中遇到了一个奇怪的问题。 setTimeout() 似乎并不总是等待适当的长度。或者也许是日期的毫秒数没有变化?
看看这个小提琴。本质上,100 毫秒的 setTimeout 似乎在 80 毫秒到 110 毫秒之间运行。根据John Resig 对 timers 的解释,我可以理解更多。但更少?
您可能需要刷新一次或两次才能看到问题,因为它有时在第一次运行时可以正常工作。它似乎在 IE 和 Chrome 中工作得很好。
这是我在小提琴中使用的代码:
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() 并检查每个增量以查看所需时间是否已经过去来解决该问题。看到这个小提琴。
但是,我仍然很想知道是否有人可以阐明问题的根源