为什么我的1000毫秒超时功能需要超过1秒的功能?

时间:2018-03-13 18:25:49

标签: javascript

我正在编写一个Javascript计数器函数,但我不太确定。

假设1000ms === 1s。



    var ms = 0;
    var s = 0;

    setInterval(() => {document.querySelector('#ms').innerHTML = ms++}, 1);
    setInterval(() => {document.querySelector('#s').innerHTML = s++}, 1000);

    <div id="ms">0</div>
    <div id="s">0</div>
&#13;
&#13;
&#13;

假设从0到1000运行的毫秒函数的速度与从0到1运行的第二个函数的速度相同,但结果似乎是1000ms!== 1s。我误解了一些关于毫秒的事情吗?

非常感谢!

2 个答案:

答案 0 :(得分:3)

它不会那样工作。定义计时器(setTimeout或setInterval)时,JS引擎不保证它将在1,000毫秒内运行,因为它取决于它在队列中的处理。

此外,如果任务已存在,则计时器不会在队列中添加任务。这意味着如果计时器到期并且该计时器的队列中已经有一个实例,那么它不会再次添加。

我推荐你这本书:https://www.amazon.com/dp/1617292850/?tag=stackoverflow17-20。它有一章关于事件,它准确地解释了你的要求。

答案 1 :(得分:0)

  

与所有应用程序一样,Web浏览器轮流使用一块CPU   时间和他们必须等待的时间将根据负载而变化。   这就是导致异步定时器延迟的原因 - 一个200ms的定时器   实际上可能需要202ms,或204,这将逐渐发送   秒表没时间了。

     

在这种情况下的解决方案是不依赖于计时器的速度   所有,而是,每个循环新查询系统时间并派生   那个输出。

来源:Sitepoint