定时器清除问题

  • image.png
let arr = [1, 2, 3, 4]
let loopTimer//外层定时
let Timer=[]//内层延迟
function setTimeOut (arr,endTimeout) {
  let tempArr=[]
  for (let i = 0; i < arr.length; i++) {
    tempArr.push(setTimeout(() => {
      // fn(i,arr)
      console.log(arr[i])
    }, 2000 * i))
  }
  Timer=tempArr
}
function setInterVal (fn, arr) {
  fn(arr)
  loopTimer = setInterval(() => { fn(arr) }, arr.length * 2000)
}
setInterVal(setTimeOut,arr)
clearInterval(loopTimer)
Timer.forEach((item)=>{
  clearTimeout(item)
})

如何清除setTimeOut里面的输出

阅读 2.4k
4 个回答

你那 arr 里有 4 个元素,循环里 Timer 被赋了 4 遍值,可你最后只 clearTimeout 掉最后一次赋值的那个了,前 3 个你也没存起来啊?

clearTimeout不好使?

你的代码逻辑上有问题啊,不过后面的Timer.forEach部分就是清理setTimeOut的部分啊
按你这样是不能测试的,因为刚建立起来,还没有开始触发就被清理了。

取巧版,
  • 1)递归使用setTimeout。
  • 2)通过设置一个变量和数组长度减一比较;相等时变量设置为0,否则变量自增。
let arr= [1,2,3,4]
let i= 0;//下标值。
let moveGap=15000;//间隔时间
let moveTimer//计时器
function circleMove(arr) {
    console.log(i,new Date().toUTCString())
    i<arr.length-1?i=i+1:i=0
    moveTimer=setTimeout('circleMove(arr)',moveGap)
}
circleMove(arr)
//clearTimeout(moveTimer)//暂停循环输出
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题