Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ротация лога 
V
    Опции темы
fish9370
Дата 27.12.2014, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: нет
Всего: 1



Есть бесконечный лог, который пребывает по websockets, и кладется в div. Подскажите как лучше сделать ротацию, чтобы ограничиться, к примеру, 100 строками? Алгоритм FIFO

- использую jquery


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Cheloveck
Дата 28.12.2014, 00:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Проще всего взять knockout и сделать что-то вроде того

Код

<div data-bind="foreach: log">
    <div class="item">
        <div class="time" data-bind="text: time"></div>
        <div class="text" data-bind="text: text"></div>
    </div>
</div>


Код

var model = {
    log: ko.observableArray([])
};
ko.applyBindings(model);

var index = 0;

setInterval(function() {
    if (model.log().length == 10)
        model.log.shift();
    model.log.push({
        time: new Date(),
        text: "Message #" + index++
    });
}, 1000);


http://jsfiddle.net/Lz6xegt0/4/

Это сообщение отредактировал(а) Cheloveck - 28.12.2014, 00:21


--------------------
user posted image
PM Jabber   Вверх
fish9370
Дата 28.12.2014, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: нет
Всего: 1



Если я правильно Вас понял, идея состоит в том, чтобы раз в секунду отсекать лишние строки?

одно уточнение: лог приходит как Plain Text, т.е. его сначала надо парсить, чтобы побить на строки

лог прибывает не равномерно, может прибывать очень интенсивно, а может отсутствовать часами. Если мы будем вхолостую каждую секунду выполнять какую-то работу, пусть даже и пустяковую, нужно ли это?

возможно, более эффективно в момент получения новой порции лога, разбить ее на строки, добавить в div и после этого сразу удалить лишнее?

но ведь, чтобы понять, сколько лишних строк нужно удалить, нужно будет каждый раз дергать DOM, для вычисления количества элементов, можно ли это как-то избежать?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Cheloveck
Дата 29.12.2014, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата(fish9370 @  28.12.2014,  16:35 Найти цитируемый пост)
Если я правильно Вас понял, идея состоит в том, чтобы раз в секунду отсекать лишние строки?

Нет, не правильно. Я использовал setInterval только лишь для эмуляции источника лога. Основная идея состоит в том, чтобы перед добавлением новой записи удалить самую старую, если записей уже масимально (у меня 10).
Цитата(fish9370 @  28.12.2014,  16:35 Найти цитируемый пост)
но ведь, чтобы понять, сколько лишних строк нужно удалить, нужно будет каждый раз дергать DOM, для вычисления количества элементов, можно ли это как-то избежать? 

В том то и дело, что нокаут не будет дёргать дом, он его (DOM) строит по модели. Кроме того, удалять можно всегда одну строку перед добавлением одной строки.

Это сообщение отредактировал(а) Cheloveck - 29.12.2014, 00:08


--------------------
user posted image
PM Jabber   Вверх
fish9370
Дата 29.12.2014, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: нет
Всего: 1



Цитата(Cheloveck @  29.12.2014,  00:05 Найти цитируемый пост)
В том то и дело, что нокаут не будет дёргать дом, он его (DOM) строит по модели.


а это не хуже, строить DOM, вместо того, чтобы посчитать количество элементов? я бы не хотел делать ни то, ни другое (но похоже считать придется)

Цитата(Cheloveck @  29.12.2014,  00:05 Найти цитируемый пост)
Кроме того, удалять можно всегда одну строку перед добавлением одной строки.


хороший способ, если бы приходила всегда одна строка. Строк может прити сколько угодно


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Cheloveck
Дата 30.12.2014, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата(fish9370 @  29.12.2014,  23:05 Найти цитируемый пост)
а это не хуже, строить DOM, вместо того, чтобы посчитать количество элементов?

Элементы дома будут достраиваться только для новых элементов массива. Старые элементы дома никто трогать не будет.


Цитата(fish9370 @  29.12.2014,  23:05 Найти цитируемый пост)
хороший способ, если бы приходила всегда одна строка. Строк может прити сколько угодно 

Удали это сколько угодно перед добалением. Я не понимаю, в чём проблема? Мозг включи и почитай доки по нокауту!


--------------------
user posted image
PM Jabber   Вверх
fish9370
Дата 30.12.2014, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: нет
Всего: 1



Цитата(Cheloveck @  30.12.2014,  12:07 Найти цитируемый пост)
Удали это сколько угодно перед добавлением. Я не понимаю, в чём проблема? Мозг включи и почитай доки по нокауту! 


Человек, ты абсолютно прав, нокаут наверняка хороший инструмент, но мне он сейчас не подходит. Проблему я конечно решил, хоть и абсолютно топорно

Код

var lines = event.split(/\n/);
$.each(lines, function(index, value) {
     syslog.append('<div class="line">' + value + '</div>');
});

var count = syslog.find('.line').length;
if (count > 100)
     syslog.find('.line:lt(' + (count - 100) + ')').remove();



--------------------
undefined
PM MAIL WWW ICQ   Вверх
sQu1rr
Дата 30.12.2014, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 1
Всего: 13



Я не понимаю а в чем проблема что бы хранить лог в переменной, обновлять ее, а только потом DOM.
Javascript феерический быстр. DOM - тормоз. чем меньше обращений к DOM тем лучше.

Вот псевдокод, не проверял на корректность, но идея такая:
Код

var log = [];

// обновление
log.concat(event.split(/\n/));
if (log.length > N)
log = log.slice(log.length - N, N);

// отрисовка
var temp = $('<div>');
$.each(log, function(index, value) {
    temp.append( $('<div>', { class: 'line' }).append( value ) );
};
syslog.empty().append( temp.children() );

PM MAIL Skype GTalk   Вверх
fish9370
Дата 30.12.2014, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: нет
Всего: 1



sQu1rr, спасибо за совет, попробую сравнить на досуге.

Но мне не нравится глобальная переменная. Не нравится потому, что потенциально логов может быть много. В идеале меня вообще не должно заботить сколько логов на странице.

Можете, что-то посоветовать?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
sQu1rr
Дата 6.1.2015, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 1
Всего: 13



Цитата(fish9370 @  30.12.2014,  18:18 Найти цитируемый пост)
Но мне не нравится глобальная переменная. Не нравится потому, что потенциально логов может быть много. В идеале меня вообще не должно заботить сколько логов на странице.

Можете, что-то посоветовать? 

Да.
Код

var log = {};
log['log1'] = [];
log['log2'] = [];
// ну вы понели
var useLog = function(logName) {
    console.log(log[logName].length);
}; // ну вы полели, угу


А в глобальной переменной нет ничего плохого. Это же жабаскрипт, тут подругому между разными скриптами никак. Даже этот ваш jquery делает 2 (как минимум) глобальных
А еще
Код

(function() {
    var log = {};
    ...
    $('button').click() {
        $.ajax(...).success(function() {
            log['logN'].length;
        });
    });
})();
console.log(log); // Nullpointer exception или как он там


Это сообщение отредактировал(а) sQu1rr - 6.1.2015, 20:01
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1272 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.