Manejo de la respuesta incremental del servidor en AJAX (en JavaScript)

Tengo la aplicación AJAX que actualiza la página según la respuesta del servidor. El comando en el que se basa la respuesta del servidor AJAX toma mucho tiempo para generar una respuesta completa, pero envía información parcial tan pronto como se calcula. Esta respuesta parcial / información parcial se envía en "ráfaga", y el tiempo y el tamaño de cada ráfaga son impredecibles. La secuencia de comandos CGI (en Perl) que transmite la salida del comando al navegador web (a la solicitud AJAX) tiene activada la función de autoflush.

La respuesta del servidor se basa en la salida de un comando externo. Mientras que 'time cmd> / dev / null "da alrededor de 10.0 segundos en promedio,' time cmd | head> / dev / null 'da menos de 0.1 segundos (por ejemplo, datos). Todos los datos son el resultado de una sola llamada a este comando externo .

La situación se parece a la siguiente.(Sigue el diagrama ASCII-art):

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

request -\
          \
           \
            \
             \->

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

Tengo algunas preguntas sobre este problema.

Nota: el lado del servidor se realiza como script CGI en Perl, y preferiría ver (también) la solución sin usar la biblioteca / framework de JavaScript como jQuery.

La salida del comando utilizado por el lado del servidor de la aplicación AJAX se basa en la línea. Cada grupo de líneas, comenzando con un tipo definido de línea y terminando con otro tipo de línea, consta de datos independientes e inalterables. ¿Debería simplemente transmitir la respuesta de un comando como 'texto / sin formato' y realizar el procesamiento en JavaScript en el lado del cliente, o debo preprocesar los datos en el servidor y enviar fragmentos enteros de datos como JSON utilizando el tipo Mime 'application / json'?

Podría suceder que una gran parte de los datos enviados a la vez por el servidor pronto sean seguidos por otra parte de los datos. ¿Cómo lidiar con la situación cuando?onreadystatechange se invoca el controlador mientras que la invocación anterior no terminó de funcionar? ¿Debo usar la variable global como semáforo, o pasar la variable de estado como parámetro del manejador (bueno, usexhr.onreadystatechange = function() { handleRequest(xhr, state) })?

¿Debo usar 'text / plain' o 'application / json', o tal vez 'multipart / x0mixed-replace' para esto? Nota: esta aplicación debería funcionar en (alomst) cualquier navegador.

Cómo lidiar con el navegador web (motores de JavaScript) que invocan onReadyStateChange solo después de recibir una respuesta completa (por lo que no veo)xhr.readyState == 3 es decir, respuesta parcial más de una vez)? Bueno, además de usar algún framework de JavaScript.

Cómo tratar las respuestas incompletas (que en esta situación significan líneas incompletas).

¿Debo enviar el marcador de fin de respuesta, o confiar en el contador para verificar si recibimos todos los datos, o simplemente puedo confiar en la detección?xhr.readyState == 4?

Incluso una respuesta parcial sería útil.

Respuestas a la pregunta(2)

Su respuesta a la pregunta