我在Firefox 12中遇到了一个奇怪的问题.setTimeout()似乎并不总是等待适当的长度.或者也许这是没有jive的日期毫秒?
看看这个小提琴.从本质上讲,100ms的setTimeout似乎可以在80ms到110ms之间运行.根据John Resig对计时器的解释,我可以理解更多.但少?
您可能需要刷新一次或两次以查看问题,因为它有时在第一次运行时正常工作.它似乎在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);
}
Run Code Online (Sandbox Code Playgroud)
以下是古怪输出的示例:

这是我的浏览器信息:

非常感谢你阅读我的问题!我希望有人可以对此有所了解.
更多信息
我通过使用setInterval()并检查每个增量以查看是否已经过了所需的时间来解决这个问题.看到这个小提琴.
但是,我仍然非常有兴趣听听是否有人能够解决问题的根源
是的。setTimeout的准确性取决于许多因素,并且不能保证始终在您指定的确切时间执行。
我不能以任何权威的方式这么说,但我大胆猜测 Firefox 为了看起来更快,会暂时加速 JS 引擎以使一切运转起来(这很有趣,因为根据我的经验,基于计时器的在我的 Firefox 版本中,函数实际上一开始运行速度较慢)。
既不setTimeout承诺setInterval它们将在正确的时间执行,如您发布的链接所述。然而,使用setInterval,您可以受益于计时器循环,它可以通过在落后太远的情况下赶上来“纠正自身”,因此无论您尝试做什么,它可能都更合适。
无论如何,这是我在 Macbook 10.6.8 上的结果:
火狐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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1524 次 |
| 最近记录: |