如何在达到数据的最大大小时清除浏览器缓冲区

时间:2017-06-14 15:10:33

标签: javascript angularjs browser buffer

我使用socket.io每分钟接收大约10,000封邮件的重量直播,下面代码的问题我设置了Bufferlimit 2MB所以一旦达到最大尺寸我有shift()首先重新启动来自$scope.event的项目。但是当我看到$scope.event.length开始增加并冻结浏览器时,我发现了。

如何管理繁重的流媒体并移除设置为BufferLimit的商品?

有什么更好的方法可以解决这个问题吗?

main.html中

<div class="panel-body display-logs" scroll-bottom="event" style="width:100%;">
                <ul style="list-style: none;">
                    <li ng-repeat="message in event" ng-class="{lastItem: $last}"><span>{{message.value}}</span></li>
                </ul>
            </div>

ctrl.js

    var Bufferlimit = 1024 * 1024 * 2;
    $scope.event = [];
    var totalReceived = 0;

    socket.on(searchEnv + 'Consumer', function(data) {
        var messageSize = getBytesForBuffer(data);
        safelyAdd({
            id: $scope.event.length,
            value: data,
            messageSize: messageSize
        });
    });

    function safelyAdd(element) {
        if (totalReceived > Bufferlimit && $scope.event.length) {
            totalReceived -= $scope.event[0].messageSize;
            $scope.event.shift(); //delete first element in $scope.event
            console.log('totalReceivedBytes', totalReceived);
            console.log('Length', $scope.event.length);
        }
        $scope.event.push(element); //then push new item..

    }

    function getBytesForBuffer(str) {
        var strBytes = str.length * 2;
        checkLimit(strBytes);
        return strBytes;
    }

function checkLimit (val){
        totalReceived += val;
    }

1 个答案:

答案 0 :(得分:0)

如果这是所有相关代码,那么看起来你只在超过缓冲区限制时才更新totalReceived,但是由于你没有添加收到的项目长度,它仍然为零而你的数组只是继续无限增长。

我认为你只是遗漏了以下内容:

else { totalReceived += element.length }