如何在达到一定大小时重置数组对象?

时间:2016-10-13 20:48:33

标签: javascript angularjs arrays browser buffer

我使用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
    });
});

3 个答案:

答案 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>