1

У меня есть таймер, который каждые 10 секунд обследует сервер для данных. Однако каждый раз, когда пользователь переключается на другой контроллер, таймер должен быть уничтожен. По какой-то причине это не происходит с моим кодом ниже. Таймер продолжает опрос сервера независимо от того, меняют контроллеры.отмена angularjs таймаут после изменения маршрута не работает

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); 
     } 
    }); 

    }; 

ответ

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); 
     } 
    }); 
}; 
+0

отлично. благодаря! – user1424508

+0

Мне повезло ждать события $ detroy, как описано в аналогичном вопросе: https://stackoverflow.com/questions/30938963/how-to-stop-interval-on-leaving-ui-state – Eric

Смежные вопросы