用setTimeout实现setInterval

2,058 阅读1分钟

setInterval概念

实现定时调用函数,可按照指定的周期来调用函数或计算表达式;setInterval会一直不断地调用函数,直到clearInterval被调用或者窗口被关闭。

setTimeout概念

用于在指定时间后调用函数或计算表达式;只会执行一次;

setTimeout实现setInterval

function mySetTimeout(func,delay){
  //声明timer,用于后面清除定时器
  let timer = null
  const interval = () =>{
    //执行对应传入函数
    func()
    //用timer接收setTimeout返回的定时器编号
    //setTimeout接收interval和delay,等待delay结束后,再次执行setTimeout
    timer = setTimeout(interval,delay)
  }
  //第一次调用setTimeout,调用interval,时延为delay
  setTimeout(interval,delay)
  //返回一个cancel方法取消调用
  return {
    cancel: ()=>{
      //清除timer编号的定时器
      clearTimeout(timer)
    }
  }
}

// 测试
//传进一个console.log的函数,解构出cancel方法
const { cancel } = mySetTimeout(() => console.log(888),1000)
setTimeout(()=>{
  cancel()
},4000)

setInterval的缺点

1、无视代码错误

setInterval执行过程中会无视自己调用的代码,会持续不断地调用改代码;

2、无视网络延迟

无视对网络请求的响应是否完成,会不断发送请求;

3、不保证执行

到了时间间隔,如果setInterval需要调用的函数需要花费时间较长,可能就会被直接忽略。

扩展

用setInterval实现setTimeout

function mySetInterval(func,delay){
  //timer用来接收setInterval返回的编号,用于后面清除setInterval
  //setInterval会一直执行,但是在setInterval里面执行clearInterval()将会被清除
  const timer = setInterval(()=>{
    //执行传入函数
    func()
    //清除该次setInterval
    clearInterval(timer)
  },delay)
}