javascript - 在setinterval 函数内部 clearinterval 失败

 PAISONG_675 发布于 2022-11-09 12:26
  1. 直接贴代码:

    var logininfo = [];    //初始化定时器数组
    for(var i = 0; i < $scope.qrcodes.length; i++){
            logininfo[i] = self.setInterval(getloginfo,3000);
    }
    function getloginfo(){
         uuid = $scope.qrcodes[i];
         statusservice.getstatus(uuid).then(function (result) {
         switch(result){
               case 200 : $scope.loginstatus[i] = '登录成功';break;
               case 500 : $scope.loginstatus[i] = '服务器错误';break;
               case 400 : $scope.loginstatus[i] = '正在登录';break;
               default : $scope.loginstatus[i] = '无消息';break;
         }
         if($scope.loginstatus[i] == '登录成功') {
               self.clearInterval(logininfo[i]);
         }
         console.log($scope.loginstatus[i]);
         },function (err) {
               console.log(err);
         })
     }
                        
                    

这里有几个点需要get一下,

  1. setinterval 是已经正常执行了的。 console.log($scope.loginstatus[i]); 能够无限循环的打印出预期的结果

  2. if($scope.loginstatus[i] == '登录成功') 这个判断也正常执行了,但是内部的clearinterval感觉执行失败了,函数还是在不断的循环下去。

3 个回答
  • 两个点:闭包,js单线程
    很明显这产生了闭包,在循环中定义延时或者定时器一定会出现这种情况
    分为两个步骤,循环执行和函数执行
    1、循环执行时,logininfo[i]中确实被写入了一个定时器,因为单线程,循环结束时才会执行第一个定时器
    2、但是函数执行,你在函数中访问i时,循环已经结束了!结束了!你访问到的i是数组logininfo中的最后一个值,所以肯定没法清除定时器,清除的只是最后一个定时器

    不知道你为什么会这样写,要实现什么功能,需要这么多定时器

    2022-11-12 11:01 回答
  • 去理解一下闭包...

    2022-11-12 11:01 回答
  • 作用域问题,你这个时候的人i一直都是$scope.qrcode.length ,自然不能清楚定时器

    2022-11-12 11:01 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有