收藏
回答

如何关闭递归调用的setTimeout?

a() {
  setTimeout(function () {
/..
若干代码
../
     this.a()
   }, 5000)
 },

在a页面每隔固定的时间要执行一次a函数,但是当使用redirectTo跳转到b页面时,a函数还是会不停地递归调用自己,clearInterval也不能关闭

回答关注问题邀请回答
收藏

3 个回答

  • 无言
    无言
    发表于小程序端
    2021-01-07
    啊这 setInterval可以实现同样效果吗?为啥要这样调?
    2021-01-07
    有用 1
    回复 3
    • 乌诶魏
      乌诶魏
      2021-01-07
      用倒是也能用,不过度娘建议用setTimeout写循环,好像是说setInterval不关心函数执行结果,所以想先用这个试试
      2021-01-07
      回复
    • 无言
      无言
      发表于小程序端
      2021-01-08回复乌诶魏
      那这样,你每次调用其实都是新建一个定时器的,页面定义一个数组,用于存放定时器序号。a函数里面 var abc =settimeout(); 然后把abc push进数组,卸载页面的时候一个个cleartimeout(arr[i])。你也可以在最开始调用的时候把时间戳记下来,清除的时候把已经结束的timeout跳过。
      2021-01-08
      1
      回复
    • 无言
      无言
      发表于小程序端
      2021-01-08回复无言
      或者是 执行timeout函数结束的时候,把序号从数组里删掉
      2021-01-08
      1
      回复
  • 缘,妙不可言
    缘,妙不可言
    2021-01-07

    递归里头写跳出递归的语句试试。

    2021-01-07
    有用 1
    回复 1
    • 乌诶魏
      乌诶魏
      2021-01-07
      写了,现在就是在关闭页面的时候设置 getApp().globalData.timekey = false; 然后在递归里判断这个的值,不过总感觉应该有别的方法
      2021-01-07
      回复
  • sheldon.wong
    sheldon.wong
    2021-01-22

    你可以这样做

    a() {
      const _timer = setTimeout(() => {
        
        if(_timer){
          clearTimeout(_timer)
        }
        
        if('如果未达到结束条件则继续递归'){
          this.a()
        }
      }, 5000)
      // 保存当前引用,方便全局清除
      this.timer = _timer
    }
    // 页面销毁处
    onUnload(){
      // 清除
      if(this.timer){
        clearTimeout(this.timer)
      }
    }
    
    2021-01-22
    有用
    回复
登录 后发表内容
问题标签