Работа с добавочным ответом сервера в AJAX (в JavaScript)

У меня есть приложение AJAX, которое обновляет страницу на основе ответа сервера. Команда, на которой основан ответ сервера AJAX, занимает много времени для генерации полного ответа, но она отправляет частичную информацию, как только она рассчитывается. Этот частичный ответ / частичная информация отправляется в «пакете», а время и размер каждого пакета непредсказуемы. Сценарий CGI (на Perl), который передает выходные данные команды в веб-браузер (по запросу AJAX), имеет функцию автозапуска.

Ответ сервера основан на выводе внешней команды. Хотя & quot; время cmd & gt; / DEV / нуль & Quot; дает в среднем около 10,0 секунд, «время cmd | голова & gt; / DEV / нуль & APOS; дает менее 0,1 секунды (например, данные). Все данные являются результатом одного вызова этой внешней команды.

Ситуация выглядит следующим образом(ASCII-art diagram follows):

 client |     | server
---------     ---------

request -\
          \
           \
            \
             \->

             /- response
            /      .
           /       .
          /  /-    .
       <-/  /      . 
           /       .
          /  /-  [end]
       <-/  /
           /
          /
       <-/

У меня есть несколько вопросов по этой проблеме.

Note: серверная часть выполняется в виде CGI-скрипта на Perl, и я бы предпочел увидеть (также) решение без использования библиотеки / фреймворка JavaScript, таких как jQuery.

The output of command used by server side of AJAX app is line based. Each group of lines, beginning with one defined kind of line, and ending with other kind of line, consist of independend and unchangeable data. Should I just stream response from a command as 'text/plain' and do processing in JavaScript on client side, or should I pre-process data on server, and send whole chunks of data as JSON using 'application/json' mimetype?

It might happen that large chunk of data send at once by server is followed soon by another chunk of data. How to deal with situation when onreadystatechange handler is invoked while previous invocation didn't finished work? Should I use global variable as semaphore, or pass state variable as handler parameter (well, use xhr.onreadystatechange = function() { handleRequest(xhr, state) })?

Should I use 'text/plain' or 'application/json', or perhaps 'multipart/x0mixed-replace' for this? Note: this app should work in (alomst) any browser.

How to deal with web browser (JavaScript engines) which invoke onReadyStateChange only after receiving complete response (so I don't see xhr.readyState == 3 i.e. partial response more than once)? Well, beside using some JavaScript framework.

How to deal with incomplete responses (which in this situation mean incomplete lines).

Should I send end of response marker, or rely on counter to check if we received all data, or can I simply rely on detecting xhr.readyState == 4?

Даже частичный ответ будет полезен.

Ответы на вопрос(2)

Ваш ответ на вопрос