Уведомления Dojo dgrid + WebSocket приводят к тому, что приложение перестает отвечать на запросы
В моем приложении я использую OnDemandGrid
при поддержке Request + Trackable dstore, чтобы отобразить мои данные пользователю.
Сервер отправляет клиенту уведомления через websocket для добавления новых записей в сетку. Чтобы добавить новые записи в сетку, магазин генерирует событие add, что-то вроде следующего фрагмента кода:
function _emitAddEvent(store, entity) {
store.emit('add', {
target: entity,
id: entity.id
});
}
Пока здесь все хорошо. Приложение получает новую запись от сервера, которая будет добавлена в сетку, и добавляет ее (без обновления сетки). Проблема в том, что сервер отправляет слишком много уведомлений за небольшой промежуток времени. Хранилище отправляет все события в dgrid, но сетка тратит некоторое время, чтобы отобразить все строки. Поскольку слишком много записей для добавления, приложение перестает отвечать на запросы. Если сервер прекращает отправку данных клиенту, через некоторое время приложение восстанавливает и правильно отображает все строки. Теперь возникает вторая (но незначительная) проблема.
Вторая проблема заключается в том, что после того, как сетка отображает все новые строки, она не уничтожает слишком длинные строки. Я установил farOffRemoval
атрибут, но, кажется, обрабатывает только случаи, когда происходит прокрутка и новые данные запрашиваются на сервер. Я хотел бы знать, есть ли обходной путь, который не зависит от прокрутки, чтобы уничтожить узлы, которые находятся слишком далеко от текущей позиции пользователя в сетке.
1 ответ
Ну, мне удалось закодировать обход первой проблемы. Поскольку приложение перестало отвечать на запросы, потому что клиент за короткий промежуток времени получил много уведомлений, я решил добавить события в очередь и отправлять их максимум по одному в секунду. dojo/throttle
вместе с setInterval было достаточно для этого.
Второй вопрос, связанный с farOffRemoval
атрибут, я не смог решить. После некоторого тестирования я заметил, что в браузере может быть много DOM-узлов без значительной потери производительности (конечно, это зависит от компьютера пользователя), поэтому я просто оставил сетку нетронутой.