.run块中$ interval的意外行为

时间:2014-05-28 14:22:02

标签: javascript angularjs rootscope

我有一个Angular JS应用程序,我想在路由成功更改时每秒进行一次全局操作。所以我创建了一个.run()块,其中我是DI $ interval并在$ routeChangeSuccess上使用$ interval。奇怪的是,每次改变路线后,间隔开始越来越快。 这是我的代码:

app.run(["$interval", "$rootScope", function($interval, $rootScope){

$rootScope.$on("$routeChangeSuccess", function(event, current){
    if(current.$$route.authenticate){
        $interval(function(){
            console.log("whatever");
        }, 1000);
    }

});

}]);

总而言之,“无论什么”控制台日志开始越来越快。是因为 $ interval 是一个Singleton所以每次都会重新创建吗?但为什么不删除旧的 $ interval

2 个答案:

答案 0 :(得分:0)

我不明白为什么要在每个routesChange上附加一个每秒运行一次的新间隔。如果我理解正确,你希望它在路线需要authenticate时每秒检查一次吗?如果是,则如果路线不再是interval,则需要取消authenticate

如果您不想再将其取消,则需要删除$interval

var stopTime = $interval(DoJob, 1000);

// delete when you dont need it anymore.
$interval.cancel(stopTime);

请参阅$interval了解app.run(["$interval", "$rootScope", function($interval, $rootScope){ var intervalPtr = null; $rootScope.$on("$routeChangeSuccess", function(event, current){ //page needs authentication //and interval was not set yet. if(current.$$route.authenticate && intervalPtr === null){ intervalPtr = $interval(function(){ console.log("whatever"); }, 1000); // page that does not need authentication // reset only of there is a interval running } else if (intervalPtr !== null) { $interval.cancel(intervalPtr); intervalPtr = null; } }); }]);

{{1}}

答案 1 :(得分:0)

$interval doc:

  

此服务创建的间隔时间必须明确销毁   你完成了它们。特别是它们不是自动的   当控制器的范围或指令元素被破坏时被破坏   销毁。你应该考虑到这一点,并确保   总是在适当的时候取消间隔。

所以在创建新的$ interval之前不要忘记取消之前的$ interval:

app.run(["$interval", "$rootScope", function($interval, $rootScope){
var interval = null;

$rootScope.$on("$routeChangeSuccess", function(event, current){
      $interval.cancel(interval);        
      if(current.$$route.authenticate){
        interval = $interval(function(){
            console.log("whatever");
        }, 1000);
    }

});

}]);