的setInterval 1毫秒似乎并没有实际上是1ms的
我想一次文件需要多长时间使用它来下载一个HTTPRequest像这样:的setInterval 1毫秒似乎并没有实际上是1ms的
function getFile() {
'use strict';
var url = "data.bin";
var rawFile = new XMLHttpRequest();
var timer_var = setInterval(theTimer, 1);
rawFile.open("GET", url, true);
rawFile.onreadystatechange = function() {
if(rawFile.readyState === XMLHttpRequest.DONE && rawFile.status === 200) {
toLog(rawFile.responseText);
window.clearInterval(timer_var);
toLog("Milliseconds for download: " + time_taken);
}
};
rawFile.send(null);
}
function theTimer() {
'use strict';
toLog(time_taken);
time_taken++;
}
正如你可以看到我已经setInterval
打电话theTimer
每一毫秒。所有thetimer()
确实增加了一个变量,理论上这个变量应该有一个以毫秒为单位的时间间隔运行的值。
当文件被下载时,我输出数据,清除计时器并显示以毫秒为单位的时间。但是,价值不加起来。我应该差不多2秒钟,但只能在250ms左右。
为什么setInterval
真的不是每1ms?
延迟
的时间,以毫秒为单位(千分之一秒),则定时器应该 延迟中所指定的功能或代码的执行之间。 如果这个 参数小于10,则使用值10。请注意,实际的 延迟可能会更长;
(Mozilla的,但其他浏览器似乎使用类似的值)
也有到the documentation of setTimeout
提的原因参考为什么“的实际延迟可能会更长。”
简而言之:
- 没有为嵌套超时的最小延迟(已经在spec)
- 非活动选项卡可以夹紧超时以减少负载
- 页面/浏览器/ OS可能处于繁忙与其他任务
在现代浏览器中似乎有a way using window.postMessage
。
感谢您解释setTimeout/setInterval中的延迟。我认为比较时间戳是一个好方法。 –
setInterval()
和setTimeout()
的延迟时间可能比指定时间长。这有多种原因:
请参阅MDN WindowTimers.setTimeout(): Reasons for delays longer than specified了解更多信息。
可能重复[什么是setTimeout的最小毫秒值?](http://*.com/questions/9647215/what-is-minimum-millisecond-value-of-settimeout) –
如果你想知道如何花了很长时间,比较时间戳。 'setInterval'和家人在给定的延迟之后的某个时候发射,当它有机会的时候。 –
嗨,亚历克斯,时间戳!当然。 –