Вопрос

Есть ли способ очистить responseText объекта XHR без уничтожения объекта XHR?

Мне нужно поддерживать постоянное соединение открытым с веб-сервером, чтобы передавать данные в реальном времени в браузер.Проблема в том, что проходит относительно большой объем данных (постоянно несколько сотен Кбит / с), поэтому использование памяти является большой проблемой, потому что это соединение должно оставаться открытым как минимум несколько минут.responseText становится очень большим очень быстро, даже несмотря на то, что JSON, который я отправляю обратно, был сжат настолько, насколько это возможно.

Из-за того, как работает серверное приложение, если я использую короткий опрос в стиле AJAX и просто уничтожаю объект XHR, когда заканчиваю с ним, я пропускаю значительные объемы важных данных даже за те несколько миллисекунд, которые требуются для анализа ответа, создания нового XHR и его отправки.У меня нет возможности использовать перекрывающиеся запросы, так как веб-сервер принимает только одно соединение одновременно.(Не спрашивайте.) Итак, Comet - это именно та модель, которая мне нужна.

Что я хотел бы сделать, так это проанализировать каждый фрагмент JSON по мере его возврата с сервера, а затем очистить responseText, чтобы я мог продолжать использовать то же соединение.Однако responseText доступен только для чтения.Он не может быть очищен напрямую ни одним из найденных мной методов.

Есть ли какая-то часть картины, которую я здесь упускаю?Кто-нибудь знает какие-нибудь приемы, которые я могу использовать, чтобы освободить responseText, когда я закончу его читать?Или есть другое место, куда могут направляться ответы сервера?

Я не включаю код, потому что это действительно почти не зависящий от кода вопрос.Процедуры Javascript, которые порождают XHRS и обрабатывают возвращаемые данные, очень, очень просты.

Это было полезно?

Решение

Именно так работает длительный опрос.Вы сохраняете индекс в последней прочитанной строке с номером и с каждым тиком вашего интервала считываете с этого момента и далее.Это одно длинное соединение, следовательно, один длинный ответ.

Свежий responseText это означало бы новую связь.Но тогда это была бы уже не комета ;)

Другие советы

В отличие от другого ответа, "длительный опрос" - это не одно длительное соединение."Длительный опрос" - это множество последовательных подключений, каждое из которых настроено так, чтобы оставаться на связи в течение достаточно длительного периода времени, если ответ не требуется.Они делай время ожидания (обычно около 25-30 секунд), а затем повторно установите новое соединение.Поскольку HTTP1.1 допускает повторное использование существующих подключений, соединение не требует повторного согласования и, следовательно, может быть восстановлено практически мгновенно.

Итак, просто используйте несколько запросов.Поскольку восстановление соединения действительно требует незначительных накладных расходов, и каждое новое соединение позволит вам уничтожить предыдущий текст ответа, это вполне жизнеспособное решение с точки зрения производительности / накладных расходов, а также решит ваши проблемы с памятью.

[Редактировать] Я говорю по опыту, как один из авторов Веб-синхронизация.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top