2016-12-24 41 views
0

我正在使用setInterval()来检查(每隔几秒钟)用户的令牌是否过期。但是,因为我已经包含在$ routeChangeStart中,所以每次路线更改时都会运行时间间隔。例如:如果我加载页面然后点击不同的路线,那么间隔再次运行,总共运行两个时间间隔。我在开始时设置了clearInterval(),因为我认为它会停止任何当前的间隔运行。但是,这不会阻止每个路线更改的运行时间间隔。除了运行$ routeChangeStart以外的时间间隔,有没有办法在路由发生变化时停止时间间隔,然后重新启动它?

$rootScope.$on('$routeChangeStart', function() { 
    clearInterval(interval); 

    var interval = setInterval(function() { 
     var token = $window.localStorage.getItem('token'); 
     self.parseJwt = function(token) { 
      var base64Url = token.split('.')[1]; 
      var base64 = base64Url.replace('-', '+').replace('_', '/'); 
      return JSON.parse($window.atob(base64)); 
     } 
     var expireTime = self.parseJwt(token); 
     var timeStamp = Math.floor(Date.now()/1000); 
     var timeCheck = expireTime.exp - timeStamp; 

     if (timeCheck <= 0) { 
      console.log('time expired'); 
      clearInterval(interval); 
     } else { 
      console.log('time not expired'); 
     } 
    }, 2000); 
}); 

回答

0

您应该改用角度$interval$interval是一个围绕setInterval的封装,它返回一个promise对象。承诺可以取消。

类似于下面的东西应该工作:

var interval = $interval(function() { 
    ... 
}, 2000); 

那么,如果您需要取消间隔,

$interval.cancel(interval); 

注意$interval需要被注入到你的服务或控制器。

+0

谢谢,但这产生了同样的问题,每次路线变化 –

1

破坏与$scope.on('$destroy', function() { $interval.cancel(intervalReturnValue);}); 控制器的间隔,你在同一范围内水平捕获事件$routeChangeSuccess启动间隔

0

而且使2个变量interval的定义,count$routeChangeStart它会是这样, ,如果你需要从内部清除它会是这样#2

var interval; 
var count = 0; 
$rootScope.$on('$routeChangeStart',function(){ 

    interval = setInterval(function() { 
    count++; 
    // make what you need here 
    // #2 
    if(condition == true){ 
    clearInterval(interval); 
    } 
    },2000); 
}); 
//here if you need after route change 
$rootScope.$on('$routeChangeSuccess',function(){ 
    if(count == 1){ 
    count = 0; 
    clearInterval(interval) 
    } 
});