Tengo una 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 es impredecible. Script CGI (en Perl) que transmite la salida del comando al navegador web (a la solicitud AJAX) tiene autoflush activado.Tratamiento de la respuesta incremental del servidor en AJAX (en JavaScript)
La respuesta del servidor se basa en la salida del 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 (diagrama ASCII-art siguiente):
client | | server
--------- ---------
request -\
\
\
\
\->
/- response
/ .
/ .
//- .
<-// .
/ .
//- [end]
<-//
/
/
<-/
tengo algunas preguntas acerca de este problema
Nota:. lado del servidor se realiza como Script CGI en Perl, y yo preferiría ver (también) la solución sin ti cantar JavaScript library/framework como jQuery.
La salida del comando utilizado por el servidor de la aplicación AJAX se basa en línea. Cada grupo de líneas, que comienza con un tipo definido de línea y termina con otro tipo de línea, consiste en datos independientes e inmutables. ¿Debo simplemente transmitir la respuesta de un comando como 'texto/simple' y hacer el procesamiento en JavaScript en el lado del cliente, o debo preprocesar datos en el servidor, y enviar fragmentos enteros de datos como JSON usando el tipo mimet 'application/json'?
Puede ocurrir que una gran cantidad de datos enviados a la vez por el servidor vaya seguida de otro trozo de datos. ¿Cómo lidiar con la situación cuando se invoca el controlador
onreadystatechange
mientras 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 controlador (bueno, usexhr.onreadystatechange = function() { handleRequest(xhr, state) }
)?¿Debo usar 'text/plain' o 'application/json', o quizás 'multipart/x0mixed-replace' para esto? Nota: esta aplicación debería funcionar en (al menos) cualquier navegador.
Cómo tratar 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, una respuesta parcial más de una vez)? Bueno, además de usar algún framework de JavaScript.Cómo lidiar con respuestas incompletas (que en esta situación significa líneas incompletas).
¿Debo enviar el marcador de fin de respuesta, o confiar en el contador para verificar si recibimos todos los datos, o puedo simplemente confiar en la detección de
xhr.readyState == 4
?
Incluso una respuesta parcial sería útil.
El problema con las repetidas solicitudes de AJAX (estrategia larga de sondeo) es que los datos son generados por un comando _single_, por lo que la parte del servidor de AJAX tendría que guardar el estado/recordar el estado del cliente/pase para enviar más solicitudes. –