Подтвердить что ты не робот

Функция интервала AngularJS $продолжается после изменения маршрута

У меня есть функция внутри контроллера, которая основана на setInterval. Я заметил, что после первого вызова он работал нормально, но продолжался даже после того, как маршрут изменился. Впоследствии я попытался использовать встроенную услугу $interval, которая автоматически отслеживала изменения в области. Однако проблема остается. Так что теперь у меня есть два вопроса. Первый - что я могу сделать, чтобы использовать повторяющуюся функцию внутри определенного контроллера, которая останавливается, когда пользователь покидает этот маршрут? Также почему функция области действия продолжается, так как я изменил области?

UPDATE - Код выглядит следующим образом

$scope.refreshScore() {
        ....
      }
$scope.refreshMe = function(){
  $interval($scope.refreshScore, 10000);
}
4b9b3361

Ответ 1

Возможно, попробуйте отменить его в событии destroy области.

$scope.refreshScore() {
   ....
}
var intervalPromise;
$scope.refreshMe = function(){
    intervalPromise = $interval($scope.refreshScore, 10000);
}
$scope.$on('$destroy',function(){
    if(intervalPromise)
        $interval.cancel(promiseFromInterval);   
});

$interval может быть не лучшим решением для этого, особенно если это некоторая операция async. Если вам абсолютно необходимо иметь некоторую временную операцию, которую вы хотите совершить с огромным успехом каждые x мс, я бы использовал что-то вроде этого:

var refreshingPromise; 
var isRefreshing = false;
$scope.startRefreshing = function(){
   if(isRefreshing) return;
   isRefreshing = true;
   (function refreshEvery(){
         //Do refresh
         //If async in then in callback do...
         refreshingPromise = $timeout(refreshEvery,10000)
    }());
} 

Затем сделайте то же самое, что и выше

Если у вас возникли проблемы с отменой обновления, вы можете попробовать подписаться на какое-то событие изменения маршрута. И делайте это там.

Ответ 2

Попробуйте следующее:

    $scope.refreshScore = function() {
       // your logic here
    }
    var promise = $interval($scope.refreshScore, 10000);
    $scope.$on('$destroy',function(){
        if(promise)
            $interval.cancel(promise);   
    });

Он уничтожит интервал, когда вы измените маршрут.

Ответ 3

Для одного простого решения вы можете просто использовать $location.$$path, прежде чем запускать событие, связанное с интервалом.

Если путь не коррелирует с ui, не запускайте его и не отменяйте.