Javascript 当动态值达到设定限制时,如何重置数组的值?

Javascript 当动态值达到设定限制时,如何重置数组的值?,javascript,html,angularjs,Javascript,Html,Angularjs,如果限制大于$scope.dynamic,我想将$scope.event重置为[],所以下面的代码没有重置$scope.event的值知道我在哪里出错了吗 main.html <ul style="list-style: none;"> <li ng-repeat="message in event track by $index | limitTo:500" ng-class="{lastItem: $last}"><span><strong&

如果
限制
大于
$scope.dynamic
,我想将
$scope.event
重置为
[]
,所以下面的代码没有重置
$scope.event的值
知道我在哪里出错了吗

main.html

<ul style="list-style: none;">
    <li ng-repeat="message in event track by $index | limitTo:500" ng-class="{lastItem: $last}"><span><strong>Log:</strong></span><span>{{message}}</span></li>
</ul>
正在这些函数中获取
$scope.dynamic

   $scope.random = function(value) {
        $scope.dynamic = value;
        totalLimit = value;
        $scope.downloadPercentage = parseFloat((value/$scope.maxBytes) * 100).toFixed(0);
        console.log('current value-dynamic',$scope.dynamic);
    };
    function getByteLen(normal_val) {
        // Force string type
        normal_val = String(normal_val);

        var byteLen = 0;
        for (var i = 0; i < normal_val.length; i++) {
            var c = normal_val.charCodeAt(i);
            byteLen += c < (1 <<  7) ? 1 :
                c < (1 << 11) ? 2 :
                    c < (1 << 16) ? 3 :
                        c < (1 << 21) ? 4 :
                            c < (1 << 26) ? 5 :
                                c < (1 << 31) ? 6 : Number.NaN;
        }
        currentBytesSum =  currentFileBytes.reduce(function(a, b) { return a + b; }, 0);
        $scope.random(currentBytesSum);
        formatBytes(currentBytesSum);
        return byteLen;
    }
    function formatBytes(bytes,decimals) {
        if(bytes == 0) return '0 Byte';
        var k = 1000;
        var dm = decimals + 1 || 3;
        var sizes = ['Bytes', 'KB', 'MB'];
        var i = Math.floor(Math.log(bytes) / Math.log(k));
        var data = parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
        console.log('sum of all the bytes', data);
        $scope.currentBytes = data;
    }
$scope.random=函数(值){
$scope.dynamic=值;
totalLimit=价值;
$scope.downloadPercentage=parseFloat((value/$scope.maxBytes)*100).toFixed(0);
log('current value dynamic',$scope.dynamic);
};
功能getByteLen(正常值){
//力串类型
正常值=字符串(正常值);
var byteLen=0;
对于(变量i=0;ivar限制=5000;
$scope.dynamic=0;
var totalReceived=0;
socket.on('ditConsumer',函数(数据){
var BYTELENGH=getByteLen(数据);
$scope.dynamic+=bytellength;
接收到的总长度+=字节长度;
$scope.$apply(函数(){
安全添加({
id:$scope.event.length,
值:数据
});
});
});
功能安全添加(元素){
如果(收到>限制){
$scope.event=[];//如果达到最大大小,则重置数组。。
$scope.dynamic=0;
}
$scope.event.push(元素);//然后推送新项。。
log('array',$scope.event);
console.log('totalLimit',totalLimit);
}
$scope.random=函数(值){
$scope.downloadPercentage=parseFloat((value/$scope.maxBytes)*100).toFixed(0);
log('current value dynamic',$scope.dynamic);
};
功能getByteLen(正常值){
//力串类型
正常值=字符串(正常值);
var byteLen=0;
对于(变量i=0;ibyteLen+=c<(1既然您已经更新了代码,我现在了解到$scope.dynamic和totalLength都要包含$scope.event数组的当前大小(以字节为单位)(不超过5000字节)而不是我之前认为的数组长度。似乎全局范围中存在许多变量,这些变量可能会在应用程序的其他位置被覆盖,所以这是一种可能性。您是否可以发布一些console.log语句?除此之外,您是否尝试将.bind(此)添加到ditConsumer回调

socket.on('ditConsumer', function(data) {
    var obj = {
        file: $scope.filename,
        data: data
    }
    getByteLen(data);
    safelyAdd({
        id: $scope.event.length,
        value: data
    });

}.bind(this));

什么是
console.log('array',$scope.event);
输出?为什么不放一个
console.log(limit+'|'+$scope.dynamic)
在内部安全添加并查看值是什么。
$scope.event
值打印的对象数组,如果它达到
限制,则应重置该数组。
为什么通过
$scope.dynamic
管理数组大小?您应该通过
$scope.event.length
检查数组大小。您可能存在全局范围问题,但我们无法请注意,因为您没有包含正在更改的代码。
$scope.dynamic
的想法是,一旦数组中的旧数据达到一定的限制,就会清除它,因为它会造成性能问题并冻结屏幕。我们在一分钟内收到5000条消息,所以我们希望字符串大小以字节为单位,并且在
$scope.event
数组对象时字节大小达到
限制
它应该重置
$scope.event
。但问题是重置数组后
$scope.dynamic
将始终更大,并且永远不会满足条件。@
$scope.dynamic
是如何计算的?
$scope.dynamic
是来自另一个将字符串转换为字符串的函数的值字节,每次收到新消息时,它都会不断变化并累加起来,所以它基本上是迄今为止收到的消息的字节总数。@hussain,如果($scope.dynamic>limit){$scope.event=[];$scope.dynamic=0;},您可能需要这样比较
但我还需要
$scope.dynamic
值来保持其他场景的总和,如果我们将
$scope.dynamic
设置为0,它会破坏一些其他逻辑,是否有方法可以重置
$scope.dynamic
仅当它检查限制时?
$scope.dyamic
值是总和,并且每次我们收到消息时都会更改。
var limit = 5000;
$scope.dynamic = 0;
var totalReceived = 0;

socket.on('ditConsumer', function (data) {
    var byteLength = getByteLen(data);
    $scope.dynamic += byteLength;
    totalReceived += byteLength;

    $scope.$apply(function() {
        safelyAdd({
            id: $scope.event.length,
            value: data
        });
    });

});

function safelyAdd(element) {
    if (received > limit) {
        $scope.event = []; //reset array if max size reached..
        $scope.dynamic = 0;
    }
    $scope.event.push(element); //then push new item..
    console.log('array', $scope.event);
    console.log('totalLimit', totalLimit);
}

$scope.random = function (value) {
    $scope.downloadPercentage = parseFloat((value / $scope.maxBytes) * 100).toFixed(0);
    console.log('current value-dynamic', $scope.dynamic);
};
function getByteLen(normal_val) {
    // Force string type
    normal_val = String(normal_val);

    var byteLen = 0;
    for (var i = 0; i < normal_val.length; i++) {
        var c = normal_val.charCodeAt(i);
        byteLen += c < (1 << 7) ? 1 :
                c < (1 << 11) ? 2 :
                        c < (1 << 16) ? 3 :
                                c < (1 << 21) ? 4 :
                                        c < (1 << 26) ? 5 :
                                                c < (1 << 31) ? 6 : Number.NaN;
    }
    currentBytesSum = currentFileBytes.reduce(function (a, b) {
        return a + b;
    }, 0);
    formatBytes(currentBytesSum);
    return byteLen;
}

function formatBytes(bytes, decimals) {
    if (bytes == 0) return '0 Byte';
    var k = 1000;
    var dm = decimals + 1 || 3;
    var sizes = ['Bytes', 'KB', 'MB'];
    var i = Math.floor(Math.log(bytes) / Math.log(k));
    var data = parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
    console.log('sum of all the bytes', data);
    $scope.currentBytes = data;
}
socket.on('ditConsumer', function(data) {
    var obj = {
        file: $scope.filename,
        data: data
    }
    getByteLen(data);
    safelyAdd({
        id: $scope.event.length,
        value: data
    });

}.bind(this));