延迟和误差是无法避免的,我们只能尽可能的去校正误差。

271 阅读1分钟

我们知道js是单线程的,加上event loop的机制,拿setInterval拿来做倒计时,往往是不准确的。

大概思路是这样的:我们使用setTimeout,假设间隔时间是1000毫秒执行一次,如果这次延迟了700毫秒,那下一次执行的时间就为300毫秒,如果延迟超过1000毫秒,那下次执行时间就为0毫秒。

var startTime = new Date().getTime();
var count = 0;


setInterval(function () {
  var i = 0;
  while (i++ < 800000000) {
  }
}, 0);

// 纠正误差
function fixed() {
  count++;
  // 延迟毫秒数
  var offset = new Date().getTime() - (startTime + count * 1000);
  // 下一次触发时间
  var nextTime = 1000 - offset;
  if (nextTime < 0) {
    nextTime = 0;
  }
  setTimeout(fixed, nextTime);

  console.log(offset)
}

setTimeout(fixed, 1000);