2009-07-20 23 views
6

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, use xhr.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.

Respuesta

0

Creo que el lado del cliente podría diseñarse para procesar datos en fragmentos, enviando solicitudes AJAX repetidas hasta que se hayan proporcionado todos los datos. Esto supone que cada fragmento se puede enviar de manera oportuna (sin problemas de tiempo de espera del lado del cliente) incluso si la respuesta completa fue grande; y este diseño probablemente sea más simple que el desarrollo de verificaciones para estados específicos de respuesta parcial que pueden variar de un navegador a otro.

En términos de si procesa el lado del servidor o del lado del cliente, eso dependerá de, p. Ej. la cantidad de clientes simultáneos que necesitaría atender y si podría usar el almacenamiento en caché para cualquiera de las respuestas; En algunos escenarios donde hay muchos clientes, es mejor repartir parte de la carga de procesamiento (siempre que puedan manejarlo, por supuesto).

+1

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. –

1

Creo que Comet es parte de lo que necesita para su solución. También puede (si tengo ese derecho) consultar el Bayeux Protocol que fue implementado por la Fundación Dojo. Todo el asunto aún es muy nuevo (aunque algo de esto podría ser posible con las primeras implementaciones de HTML5).

Además de eso, probablemente tenga que implementar el método de sondeo. La otra pregunta es, cuántos datos puede manejar el intérprete de JavaScript del lado del cliente. ¿Hay alguna posibilidad de que de alguna manera "coloque en la página" sus datos para que no tenga el problema de que la solicitud siga procesando mientras ya viene otra respuesta?

Cuestiones relacionadas