как сбросить значение массива, когда динамическое значение достигает установленного предела?

#javascript #html #angularjs

#javascript #HTML #angularjs

Вопрос:

Я хочу сбросить $scope.event [] значение, если limit оно больше $scope.dynamic , поэтому приведенный ниже код не сбрасывает значение какой $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>
 

ctrl.js

  var limit = 5000;
 $scope.event = [];
 var totalLimit;
 $scope.dynamic = this numeric value is changing based on data;
socket.on('ditConsumer', function(data) {
    var obj = {
        file: $scope.filename,
        data: data
    }
  getByteLen(data);
    safelyAdd({
        id: $scope.event.length,
        value: data
    });

});

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

получение $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;
    }
 

Комментарии:

1. что console.log('array', $scope.event); выводит?

2. Почему бы вам не поместить a console.log(limit ' | ' $scope.dynamic) внутри safelyAdd и посмотреть, каковы значения.

3. $scope.event значение печатного массива объекта, который следует сбросить, если он достигает limit

4. Зачем управлять размером массива с помощью $scope.dynamic ? вы должны проверить размер массива через $scope.event.length . Вероятно, у вас глобальная проблема с областью видимости, но мы можем видеть это, поскольку вы не включили свой изменяющийся код $scope.dynamic

5. итак, идея состоит в том, чтобы очистить старые данные в массиве, как только они достигнут определенного предела, потому что это создавало проблемы с производительностью и замораживало экран. мы получаем 5000 сообщений за одну минуту, поэтому мы хотим иметь размер строки в байтах, и когда $scope.event размер байта объекта массива достигает limit , он должен сбросить $scope.event .

Ответ №1:

 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;
}
 

Комментарии:

1. но проблема в том, что после сброса массив $scope.dynamic всегда будет больше, и он никогда не будет соответствовать условию.

2. @как $scope.dynamic вычисляется?

3. $scope.dynamic является ли значение, поступающее от другой функции, которая преобразует строку в байты, и оно будет последовательно меняться и суммироваться при каждом получении нового сообщения, так что в основном это сумма байтов от общего количества сообщений, полученных на данный момент..

4. @хуссейн, тебе, наверное, нужно сравнить вот так if ($scope.dynamic > limit) { $scope.event = []; $scope.dynamic = 0; }

5. но мне также нужно $scope.dynamic значение, чтобы сохранить сумму для другого сценария, если мы установим $scope.dynamic значение 0, это нарушит какую-то другую логику, есть ли способ, которым мы можем сбросить $scope.dynamic только при проверке предела?

Ответ №2:

Теперь, когда вы обновили свой код, я понимаю, что $scope.dynamic и totalLength должны содержать текущий размер в байтах массива $scope.event (не более 5000 байт), а не длину массива, как я думал ранее. Похоже, у вас много переменных, находящихся в глобальной области видимости, которые могут быть перезаписаны в другом месте приложения, так что это возможно. Можете ли вы опубликовать часть своей консоли.операторы журнала? Помимо этого, вы пытались добавить .bind(this) в обратный вызов ditConsumer ?

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

}.bind(this));
 

Комментарии:

1. $scope.dyamic значение равно сумме и будет меняться каждый раз, когда мы получаем сообщение.