1ms的setInterval似乎实际上不是1ms

时间:2016-11-22 22:40:31

标签: javascript timer xmlhttprequest setinterval

我正在尝试使用HTTPRequest下载文件所需的时间,如下所示:

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()都会增加一个变量,理论上它应该具有一个以毫秒为单位的值,即间隔的运行时间。

下载文件后,我输出数据,清除定时器并以ms为单位显示时间。但是,该值不会累加。我应该差不多2秒,但只能站在250毫秒左右。

为什么setInterval真的不是每1毫秒?

3 个答案:

答案 0 :(得分:2)

From the docs

  

<强>延迟

     

计时器应该以毫秒(千分之一秒)为单位的时间    执行指定函数或代码之间的延迟。 如果这样    参数小于10,使用值10。注意实际    延迟可能会更长;

(Mozilla,但其他浏览器似乎使用类似的值)

还提到the documentation of setTimeout提到“实际延迟可能更长”的原因。

简而言之:

  • 嵌套超时存在最小延迟(已在规范中)
  • 非活动标签可能会限制超时以减少负载
  • 页面/浏览器/操作系统可能忙于其他任务

在现代浏览器中似乎有a way using window.postMessage

答案 1 :(得分:0)

setInterval()setTimeout()的延迟可能会超过指定时间。这有很多原因:

有关详细信息,请参阅MDN WindowTimers.setTimeout(): Reasons for delays longer than specified

答案 2 :(得分:-1)

如果将结果乘以 4,它将得到以 ms 为单位的实数。 我只是在 chrome 中尝试过。