在路由更改不起作用后取消angularjs超时

时间:2013-12-11 05:18:12

标签: javascript angularjs angularjs-directive angularjs-ng-repeat angularjs-service

我有一个计时器,每隔10秒轮询服务器一次数据。但是,每次用户切换到另一个控制器时,计时器都应该被销毁。出于某种原因,我的代码不会发生在下面。无论我是否更换控制器,计时器都会继续轮询服务器。

controller.js

$scope.init = function() {
    //timer and timer stoper
    $scope.counter= 0;
    var mytimeout = $timeout($scope.onTimeout, 10000);

    $scope.$on('$locationChangeStart', function() {
    $timeout.cancel(mytimeout);
    });

   };

 $scope.onTimeout = function() {
  //polling server function
    $scope.counter++;
    var mytimeout = $timeout($scope.onTimeout, 10000);

    var increase = 0;
    inboxServ.check_newusers().then(function(data) {
        if (data == "true") {
            $scope.retrieveusers(increase);
        }
    });

   };

1 个答案:

答案 0 :(得分:3)

好像你有一个范围问题。您有$scope.init()创建超时(由mytimeout持有),如果您开始更改位置,还会连接逻辑以取消它。但是,执行的函数(onTimeout)会启动另一个超时,但会将其分配给不同的本地作用域mytimeout

如果你在前10秒内改变位置,我会期望它取消第一个超时,并且在那之后的任何时间都不能这样做,因为变量是不同的。

可能就像将其改为这样的事情一样简单:

$scope.init = function() {

     //timer and timer stoper
     $scope.counter= 0;
     $scope.mytimeout = $timeout($scope.onTimeout, 10000);

     $scope.$on('$locationChangeStart', function() {
         $timeout.cancel($scope.mytimeout);
     });
};

$scope.onTimeout = function() {
     //polling server function
     $scope.counter++;
     $scope.mytimeout = $timeout($scope.onTimeout, 10000);

     var increase = 0;
     inboxServ.check_newusers().then(function(data) {
         if (data == "true") {
             $scope.retrieveusers(increase);
         }
     });
};