直接贴代码:
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一下,
setinterval 是已经正常执行了的。 console.log($scope.loginstatus[i]); 能够无限循环的打印出预期的结果
if($scope.loginstatus[i] == '登录成功') 这个判断也正常执行了,但是内部的clearinterval感觉执行失败了,函数还是在不断的循环下去。
两个点:闭包,js单线程
很明显这产生了闭包,在循环中定义延时或者定时器一定会出现这种情况
分为两个步骤,循环执行和函数执行
1、循环执行时,logininfo[i]
中确实被写入了一个定时器,因为单线程,循环结束时才会执行第一个定时器
2、但是函数执行,你在函数中访问i
时,循环已经结束了!结束了!你访问到的i是数组logininfo
中的最后一个值,所以肯定没法清除定时器,清除的只是最后一个定时器
不知道你为什么会这样写,要实现什么功能,需要这么多定时器
去理解一下闭包...
作用域问题,你这个时候的人i一直都是$scope.qrcode.length ,自然不能清楚定时器