进行间隔时出现内存泄漏。我尝试了不同的方法来解决这个问题,但我无法弄清楚问题是什么。
我的代码:
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秒):
更新(不工作):
$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);
};`
答案 0 :(得分:0)
您只保留一个对上次启动间隔的引用。
一旦停止间隔,如果自上次停止间隔后启动了多个间隔,那么只有最后一个运行间隔将被清除 - 其他间隔将继续运行,而不会引用它们。
如果您一次只需要一个时间间隔,则只需在创建新$scope.updateInterval
之前检查$interval
即可。如果已定义,则在创建新内容并覆盖对旧引用的引用之前将其清除。
如果一次需要运行多个间隔,则可以保留$interval
个引用数组,然后通过整个数组停止它们(使用push为数组添加间隔,以及取下一个时弹出,停止它)。 - 或者你可以通过$interval
进行循环,因为它会遍历所有的间隔引用,然后对每个引用进行遍历。