定时器跑起来为何时间久了会不准确?

定时器跑起来为何时间久了会不准确?

由于各种鸟原因(具体原因可以自己百度),会导致定时器的时间和实际时间越来越大,那怎么解决这个问题呢?
单单用settimeout来替代setinterval是不行的,还需要补时间差!


原理

每次settimeout的时候计算时间差(实际和理想的差距),然后再计算下一次settimeout需要的时间,废话不多说,上代码!

<script>
    // 每秒倒计时的实现
    let startTime, // 开始时间
      count, // 计数器
      runTime, // 当前时间
      downSecond = 1200,  // 倒计时时间
      loopTimer = null;

    function resetDefaultValue() {
      startTime = Date.now();
      count = 0;
      runTime = 0;
    }

    resetDefaultValue(); //每次倒计时执行前要重置一下初始值
    loop();
    function loop() {
      runTime = Date.now();
      let offsetTime = runTime - (startTime + count * 1000); //时间差
      count++;
      let nextTime = 1000 - offsetTime; //下一次定时器需要的时间
      nextTime = nextTime > 0 ? nextTime : 0;
      downSecond-- ;
      // 处理逻辑区域 ---- s
      console.log('时间差:'+offsetTime, ',下一次需要时间:'+ nextTime)
      if (downSecond <= 0) {
        // 结束定时器
        clearTimeout(loopTimer)
        loopTimer = null;
        return false;
      }
      // 处理逻辑区域 ---- e
      loopTimer = setTimeout(loop, nextTime);
    }
  </script>

效果如下图:

比如这次运行需要的时间比实际时间多 4 毫秒,那么下次定时器需要的时间就是996毫秒, 彼长我消!

怎么验证定时器是否准确:

自己的定时器设个几十分钟,同时百度打开北京时间对照,或者电脑右下角的时间对照。过一会再来看(至少几分钟后),如果差个一两秒是正常,反之不正常

落魄前端-小陈
0
0
0
评论
浏览
收藏