JavaScript听众不断增加
JavaScript listeners keep increasing
我实现了一个 Web 应用程序并使用 google 开发人员工具监控性能。我注意到听众不断增加,堆也是如此。
听众增加的部分是这样的
let ival = $interval(function () {
$http.get('someurl') // this call is actually done through a service, don't know if that matters
}, 1000)
我能理解堆是否因为垃圾收集器未收集到的某些数据而增长,但我不明白为什么侦听器在增加?
这是一个可重现的最小示例:
index.html 文件:
<!doctype html>
<html ng-app="exampleModule">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
<script src="script.js"></script>
</head>
<body>
<div ng-controller="someController">
</div>
</body>
</html>
和 script.js 文件:
angular.module("exampleModule", [])
.controller("someController", [ "$http", "$interval", function ($http, $interval) {
$interval(function () {
$http.get('script.js')
}, 1000)
}])
看表演的结果和上图一样。您应该使用一个简单的网络服务器来发出 GET 请求。
您的获取请求可能持续超过 1 秒。但是你每 1 秒调用一次。因此一个请求在另一个请求完成之前开始,它们堆积起来,最终变得越来越慢。
我建议,如果上一个没有完成,请不要做请求:
let previousOneOngoing = false;
let ival = $interval(function () {
if(previousOneOngoing) return;
previousOneOngoing = true;
$http.get('someurl')
.then(function() { previousOneOngoing = false; })
}, 1000)
根据this issue, more specifically this comment,这是由于Chrome在录制性能时间线期间没有垃圾收集监听器造成的。
我实现了一个 Web 应用程序并使用 google 开发人员工具监控性能。我注意到听众不断增加,堆也是如此。
听众增加的部分是这样的
let ival = $interval(function () {
$http.get('someurl') // this call is actually done through a service, don't know if that matters
}, 1000)
我能理解堆是否因为垃圾收集器未收集到的某些数据而增长,但我不明白为什么侦听器在增加?
这是一个可重现的最小示例:
index.html 文件:
<!doctype html>
<html ng-app="exampleModule">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
<script src="script.js"></script>
</head>
<body>
<div ng-controller="someController">
</div>
</body>
</html>
和 script.js 文件:
angular.module("exampleModule", [])
.controller("someController", [ "$http", "$interval", function ($http, $interval) {
$interval(function () {
$http.get('script.js')
}, 1000)
}])
看表演的结果和上图一样。您应该使用一个简单的网络服务器来发出 GET 请求。
您的获取请求可能持续超过 1 秒。但是你每 1 秒调用一次。因此一个请求在另一个请求完成之前开始,它们堆积起来,最终变得越来越慢。
我建议,如果上一个没有完成,请不要做请求:
let previousOneOngoing = false;
let ival = $interval(function () {
if(previousOneOngoing) return;
previousOneOngoing = true;
$http.get('someurl')
.then(function() { previousOneOngoing = false; })
}, 1000)
根据this issue, more specifically this comment,这是由于Chrome在录制性能时间线期间没有垃圾收集监听器造成的。