内存泄漏,angularJS $间隔

时间:2016-01-13 10:12:53

标签: javascript intervals

进行间隔时出现内存泄漏。我尝试了不同的方法来解决这个问题,但我无法弄清楚问题是什么。

我的代码:

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

更新(不工作):

$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 个答案:

答案 0 :(得分:0)

您只保留一个对上次启动间隔的引用。

一旦停止间隔,如果自上次停止间隔后启动了多个间隔,那么只有最后一个运行间隔将被清除 - 其他间隔将继续运行,而不会引用它们。

如果您一次只需要一个时间间隔,则只需在创建新$scope.updateInterval之前检查$interval即可。如果已定义,则在创建新内容并覆盖对旧引用的引用之前将其清除。

如果一次需要运行多个间隔,则可以保留$interval个引用数组,然后通过整个数组停止它们(使用push为数组添加间隔,以及取下一个时弹出,停止它)。 - 或者你可以通过$interval进行循环,因为它会遍历所有的间隔引用,然后对每个引用进行遍历。