我使用socket.io来自服务器的传入日志,我在一分钟内收到大约5000条消息,这会冻结浏览器并限制用户对应用程序执行任何操作。有没有办法将数组$scope.event
的缓冲区大小设置为某个限制,如5Mb
,一旦达到该限制空数组对象并开始推送新消息?
ctrl.js
$scope.event = [];
socket.on('Consumer', function(data) {
var obj = {
file: $scope.filename,
data: data
}
$scope.event.push({
id: $scope.event.length,
value: data
});
});
答案 0 :(得分:1)
我不确定如何实现大小限制(以字节为单位),但是如果你想在数组大小方面设置任意限制,你可以这样做:
Method '~' of object '~' failed
答案 1 :(得分:0)
您可以使用拼接功能删除数组事件中的旧消息。请参阅文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
答案 2 :(得分:0)
我根据@charlietfl和@Michele Ricciardi在评论和答案中提到的答案,以及如何实现我在视图中显示大量项目时使用的代码。这绝对是渲染部分这里需要花费大量时间。因此,请考虑在JS和HTML中进行以下更改
$scope.events = [];
socket.on('Consumer', function(data) {
var obj = {
file: $scope.filename,
data: data
}
safelyAdd({
id: $scope.event.length,
value: data
});
});
var limit = 5000;
function safelyAdd(element){
if($scope.events.length >= limit){
$scope.events =[];//reset array if max size reached..
}
$scope.events.push(element); //then push new item..
}
您应该在HTML中执行类似下面的操作,同时使用角度本身提供的limitTo
过滤器,在评论中提及@charlietfl等大量数据。
<div>
<!-- lts display 500 records at a time so ng-repeat evaluates only 500 at once in the entire list -->
<p ng-repeat="event in events track by $index | limitTo:500"> </p>
</div>