我使用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;
}
答案 0 :(得分:0)
如果这是所有相关代码,那么看起来你只在超过缓冲区限制时才更新totalReceived,但是由于你没有添加收到的项目长度,它仍然为零而你的数组只是继续无限增长。
我认为你只是遗漏了以下内容:
else { totalReceived += element.length }