我有一个webapp写的AngularJS基本上轮询一个API到两个端点。所以,每一分钟,它轮询,看看有没有什么新的。
我发现它有一个小的内存泄漏,我已尽力找到它,但我不能这样做。在这个过程中,我已经设法减少我的应用程序的内存使用,这是伟大的。
没有做任何其他事情,每次轮询可以看到内存使用率的峰值(这是正常的),然后它应该下降,但它总是增加。我把数组的清理从[]更改为array.length = 0,我认为我确信引用不会持久,所以它不应该保留任何这一点。
我也试过这个:https://github.com/angular/angular.js/issues/1522
但没有运气…
所以,这是两个堆之间的比较:
大多数泄漏似乎来自(array),如果我打开,是通过解析API调用返回的数组,但我确信他们没有被存储:
这基本上是结构:
poll: function(service) { var self = this; log('Polling for %s',service); this[service].get().then(function(response) { if (!response) { return; } var interval = response.headers ? (parseInt(response.headers('X-Poll-Interval'),10) || 60) : 60; services[service].timeout = setTimeout(function(){ $rootScope.$apply(function(){ self.poll(service); }); },interval * 1000); services[service].lastRead = new Date(); $rootScope.$broadcast('api.'+service,response.data); }); }
基本上,假设我有一个卖方服务,所以,这将是服务变量的值。
然后,在主视图中:
$scope.$on('api.sellings',function(event,data) { $scope.sellings.length = 0; $scope.sellings = data; });
并且视图有一个ngRepeat根据需要呈现。我花了很多时间试图自己想出这一点,我不能。我知道这是一个困难的问题,但是,有谁有任何想法如何跟踪这?
编辑1 – 添加promise showcase:
这是两个服务使用的函数makeRequest:
return $http(options).then(function(response) { if (response.data.message) { log('api.error',response.data); } if (response.data.message == 'Server Error') { return $q.reject(); } if (response.data.message == 'Bad credentials' || response.data.message == 'Maximum number of login attempts exceeded') { $rootScope.$broadcast('api.unauthorized'); return $q.reject(); } return response; },function(response) { if (response.status == 401 || response.status == 403) { $rootScope.$broadcast('api.unauthorized'); } });
如果我注释掉$ scope。$ on(‘api.sellings’)部分,泄漏仍然存在,但下降到1%。
PS:我使用最新的Angular版本到目前为止
编辑2 – 在图像中打开(数组)树
它的一切都像这样,所以它是相当无用的imho