2016-01-13 4 views
0

У меня есть утечка памяти при выполнении интервала. Я испробовал разные подходы, чтобы исправить это, но я не могу понять, в чем проблема.

мой код:

updated-- 
$scope.autoUpdatePageResult = function(group){ 
    $scope.isAutoUpdate = !$scope.isAutoUpdate; 
    storageService.setLocalItem($scope.user + '-auto-update-results', $scope.isAutoUpdate); 
    if($scope.isAutoUpdate){ 
     $scope.startInterval(group); 
    } 
    else { 
     $scope.stopInterval(group); 
    } 
}; 
--updated 

$scope.startInterval = function(group){ 
    $scope.updateInterval = $interval(function() { 
     $scope.shouldReloadPage = false; 
     $scope.loading = true; 
     $scope.update = true; 
     $scope.allSessions = []; 
     for (var a in $scope.sessions){ 
      $scope.allSessions[a] = $scope.sessions[a].started; 
     } 
     delete $scope.sessions; 
     $scope.sessionGroup = group.name; 
     $scope.getSessions(); 
    }, 3*1000); 
    // 3 sec 
}; 

$scope.$on('$destroy', function() { 
    storageService.setLocalItem($scope.user + '-auto-update-results', false); 
}); 

$scope.stopInterval = function() { 
    $scope.loading = false; 
    $scope.shouldReloadPage = true; 
    if (angular.isDefined($scope.updateInterval)) { 
     $interval.cancel($scope.updateInterval); 
     $scope.updateInterval = undefined; 
    } 
}; 

это как график выглядит в когда UpdateInterval запускается и регистрируется (30 сек):

enter image description here

UPDATE (не работает):

$scope.startInterval = function(group){ 
    $scope.totalIntervals = []; 
    $scope.updateInterval = $interval(function() { 
     if($scope.totalIntervals.length > 1){ 
      $interval.cancel($scope.totalIntervals[1]); 
     } 
     $scope.shouldReloadPage = false; 
     $scope.loading = true; 
     $scope.update = true; 
     $scope.allSessions = []; 
     for (var a in $scope.sessions){ 
      $scope.allSessions[a] = $scope.sessions[a].started; 
     } 
     delete $scope.sessions; 
     $scope.sessionGroup = group.name; 
     $scope.getSessions(); 
     $scope.totalIntervals.push($scope.updateInterval); 
    }, 3*1000); 
};` 
+1

Где вызывается 'stopInterval'? Не отображается в вашем коде; возможно, добавьте призыв к уничтожению. – st2rseeker

+0

Вы можете сделать снимки кучи/кучи кучи и посмотреть, что выделяется все больше и больше. – zerkms

+0

'stopInterval' на уничтожении не работает. Я пробовал снимки кучи и выделения кучи, но я не совсем понимаю, что делать с данными, которые я получаю. –

ответ

0

Вы сохраняете только одну ссылку на свой последний запущенный inte RVAL.

Как только вы остановите интервал, если с момента последнего останова было запущено несколько интервалов, то будет выполнен только последний интервал выполнения, а остальные интервалы будут продолжать работать без ссылки на них.

Если вам нужен только один интервал за раз, вы можете просто проверить свой $scope.updateInterval перед созданием нового $interval. Если он определен, вы можете его до создания нового и перезаписывать ссылку на старую.

Если вам нужно больше одного интервала, то вы можете либо сохранить массив ссылок $interval, а затем пройти через весь массив, останавливая их (используйте push, чтобы добавить интервал в массив, и поп при приеме один, чтобы остановить его). - Или вы можете сделать цикл через $interval, поскольку он будет перебирать все его интервальные ссылки, а затем уничтожать каждый.

+0

Я тестировал, может быть, я сделал что-то не так (проверьте мой главный пост). Но это не сработает, когда '$ interval.cancel' запускает его, останавливает весь процесс обновления, даже если я просто остановлю один интервал. –

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