У меня есть приложение AJAX, которое обновляет страницу в зависимости от ответа сервера. Команда, на которой основан ответ сервера AJAX, требует много времени для генерации полного ответа, но она отправляет частичную информацию, как только она рассчитывается. Этот частичный ответ / частичная информация отправляется «пакетом», и время и размер каждого пакета непредсказуемы. В сценарии CGI (на Perl), передающем вывод команды в веб-браузер (в запрос AJAX), включена автозапуск.
Ответ сервера основан на выводе внешней команды. В то время как 'time cmd> / dev / null' дает в среднем около 10,0 секунд, 'time cmd | head> / dev / null' дает меньше 0,1 секунды (например, данные). Все данные являются результатом одного вызова этой внешней команды .
Ситуация выглядит следующим образом (следует диаграмма ASCII-art):
client | | server
--------- ---------
request -\
\
\
\
\->
/- response
/ .
/ .
/ /- .
<-/ / .
/ .
/ /- [end]
<-/ /
/
/
<-/
У меня есть несколько вопросов по этой проблеме.
Примечание. серверная часть выполняется как сценарий CGI в Perl, и я бы предпочел (также) увидеть решение без использования библиотеки / фреймворка JavaScript, например jQuery.
Вывод команды, используемой серверной частью приложения AJAX, основан на строчности. Каждая группа строк, начиная с одного определенного типа строки и заканчивая другим типом строки, состоит из независимых и неизменяемых данных. Должен ли я просто передавать ответ от команды как «текст / простой» и выполнять обработку в JavaScript на стороне клиента, или я должен предварительно обрабатывать данные на сервере и отправлять целые фрагменты данных в виде JSON с использованием типа mimetype «application / json»?
Может случиться так, что за большим фрагментом данных, отправленным сервером сразу, вскоре последует еще один фрагмент данных. Как быть в ситуации, когда обработчик
onreadystatechange
вызывается, когда предыдущий вызов не завершился? Должен ли я использовать глобальную переменную в качестве семафора или передать переменную состояния в качестве параметра обработчика (ну, использоватьxhr.onreadystatechange = function() { handleRequest(xhr, state) }
)?Должен ли я использовать для этого «text / plain» или «application / json» или, возможно, «multipart / x0mixed-replace»? Примечание: это приложение должно работать (почти) в любом браузере.
Как работать с веб-браузером (движками JavaScript), который вызывает onReadyStateChange только после получения полного ответа (поэтому я не вижу
xhr.readyState == 3
, т.е. частичный ответ более одного раза)? Ну, помимо использования какой-то инфраструктуры JavaScript.Как поступать с неполными ответами (которые в данной ситуации означают неполные строки).
Должен ли я отправить маркер конца ответа, или полагаться на счетчик, чтобы проверить, получили ли мы все данные, или я могу просто полагаться на обнаружение
xhr.readyState == 4
?
Даже частичный ответ был бы полезен.