Lidando com a resposta incremental do servidor em AJAX (em JavaScript)

Eu tenho aplicativo AJAX que atualiza a página com base na resposta do servidor. O comando em que a resposta do servidor AJAX é baseada leva muito tempo para gerar uma resposta completa, mas envia informações parciais assim que são calculadas. Esta resposta parcial / informação parcial é enviada em "burst", e o tempo e tamanho de cada burst é imprevisível. O script CGI (em Perl) que transmite a saída do comando para o navegador da Web (para solicitação AJAX) ativou o autoflush.

A resposta do servidor é baseada na saída do comando externo. Enquanto 'time cmd> / dev / null "dá cerca de 10,0 segundos em média," time cmd | head> / dev / null' dá menos de 0,1 segundos (por exemplo, dados). Todos os dados são resultado de uma única chamada para este comando externo .

A situação parece com a seguinte(Diagrama ASCII-art segue):

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

request -\
          \
           \
            \
             \->

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

Eu tenho algumas perguntas sobre esse problema.

Nota: lado do servidor é feito como script CGI em Perl, e eu preferiria ver (também) solução sem usar biblioteca / framework JavaScript como jQuery.

A saída do comando usada pelo lado do servidor do aplicativo AJAX é baseada em linha. Cada grupo de linhas, começando com um tipo definido de linha e terminando com outro tipo de linha, consiste em dados independentes e imutáveis. Devo apenas transmitir a resposta de um comando como 'text / plain' e processar em JavaScript no lado do cliente, ou devo pré-processar dados no servidor e enviar partes inteiras de dados como JSON usando o tipo de mipo 'application / json'?

Pode acontecer que grande parte dos dados enviados de uma só vez pelo servidor seja seguida em breve por outro pedaço de dados. Como lidar com a situação quandoonreadystatechange o manipulador é chamado enquanto a invocação anterior não terminou o trabalho? Devo usar variável global como semáforo ou passar variável de estado como parâmetro de manipulador (bem, usexhr.onreadystatechange = function() { handleRequest(xhr, state) })

Devo usar 'text / plain' ou 'application / json', ou talvez 'multipart / x0mixed-replace' para isso? Nota: este aplicativo deve funcionar em (qualquer) qualquer navegador.

Como lidar com o navegador da Web (mecanismos JavaScript) que invocam onReadyStateChange somente após receber resposta completa (para que eu não vejaxhr.readyState == 3 ou seja, resposta parcial mais de uma vez)? Bem, além de usar algum framework JavaScript.

Como lidar com respostas incompletas (que nesta situação significam linhas incompletas).

Devo enviar o marcador de fim de resposta ou confiar no contador para verificar se recebi todos os dados ou posso simplesmente confiar na detecçãoxhr.readyState == 4?

Até mesmo a resposta parcial seria útil.

questionAnswers(2)

yourAnswerToTheQuestion