【问题标题】:cancelling angularjs timeout after route change not working路由更改后取消 angularjs 超时不起作用
【发布时间】:2013-12-28 22:49:37
【问题描述】:

我有一个计时器,它每 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);
        }
    });

   };

【问题讨论】:

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


    【解决方案1】:

    您的范围似乎存在问题。您有$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);
             }
         });
    };
    

    【讨论】:

    猜你喜欢
    • 2017-02-24
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2022-06-24
    相关资源
    最近更新 更多