Skip to main content

setTimeout模拟setInterval

实现#

function mySetInterval(callback, delay, n = Infinity) {
let count = 0;
let timer;
timer = setTimeout(function run() {
callback();
if (count >= n) {
clearTimeout(timer);
return; // 注意,出口
}
// console.log(count, timer);
count++;
timer = setTimeout(run, delay);
}, delay);
}

测试#

// case
setInterval(() => {
console.log('1')
}, 1000)
mySetInterval(() => {
console.log('2')
}, 1000, 3)

为什么setTimeout模拟setInterval?#

setInterval事件不准确

为什么不准确?#

setInterval 有两个缺点:

  • 使用 setInterval 时,某些间隔会被跳过;
  • 可能多个定时器会连续执行;

可以这么理解:每个 setTimeout 产生的任务会直接 push 到任务队列中;而 setInterval 在每次把任务 push 到任务队列前,都要进行一下判断 image.png