Umgang mit inkrementellen Serverantworten in AJAX (in JavaScript)

Ich habe eine AJAX-App, die die Seite basierend auf der Serverantwort aktualisiert. Der Befehl, auf dem die Antwort des AJAX-Servers basiert, benötigt viel Zeit, um eine vollständige Antwort zu generieren, sendet jedoch Teilinformationen, sobald diese berechnet wurden. Diese Teilantwort / Teilinformation wird als "Burst" gesendet, und Zeit und Größe jedes Bursts sind nicht vorhersehbar. Das CGI-Skript (in Perl), das die Befehlsausgabe an den Webbrowser (zur AJAX-Anforderung) überträgt, hat die automatische Aktualisierung aktiviert.

Die Serverantwort basiert auf der Ausgabe eines externen Befehls. Während 'time cmd> / dev / null "durchschnittlich etwa 10,0 Sekunden ergibt, ergibt' time cmd | head> / dev / null 'weniger als 0,1 Sekunden (zum Beispiel Daten). Alle Daten sind das Ergebnis eines einzelnen Aufrufs dieses externen Befehls .

Die Situation sieht wie folgt aus(ASCII-Grafik folgt):

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

request -\
          \
           \
            \
             \->

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

Ich habe ein paar Fragen zu diesem Problem.

Hinweis: Die Server-Seite wird als CGI-Skript in Perl ausgeführt, und ich würde es vorziehen, (auch) eine Lösung ohne JavaScript-Bibliothek / Framework wie jQuery zu sehen.

Die Ausgabe des Befehls, der von der Serverseite der AJAX-App verwendet wird, ist zeilenbasiert. Jede Gruppe von Zeilen, die mit einer definierten Art von Zeile beginnt und mit einer anderen Art von Zeile endet, besteht aus unabhängigen und unveränderlichen Daten. Sollte ich die Antwort eines Befehls einfach als 'text / plain' streamen und die Verarbeitung in JavaScript auf der Clientseite durchführen, oder sollte ich Daten auf dem Server vorverarbeiten und ganze Datenblöcke als JSON mit dem Mimetyp 'application / json' senden?

Es kann vorkommen, dass auf einen großen Datenblock, der gleichzeitig vom Server gesendet wird, bald ein weiterer Datenblock folgt. Wie gehe ich mit Situationen um, wennonreadystatechange Handler wird aufgerufen, während der vorherige Aufruf die Arbeit nicht beendet hat? Soll ich eine globale Variable als Semaphor verwenden oder eine Zustandsvariable als Handlerparameter übergeben?xhr.onreadystatechange = function() { handleRequest(xhr, state) })?

Soll ich dafür 'text / plain' oder 'application / json' oder vielleicht 'multipart / x0mixed-replace' verwenden? Hinweis: Diese App sollte in (fast) jedem Browser funktionieren.

Wie gehe ich mit Webbrowsern (JavaScript-Engines) um, die onReadyStateChange erst nach Erhalt der vollständigen Antwort aufrufen?xhr.readyState == 3 d.h. teilweise Antwort mehr als einmal)? Nun, neben einigen JavaScript-Framework.

Umgang mit unvollständigen Antworten (die in dieser Situation unvollständige Zeilen bedeuten).

Soll ich einen Marker für das Ende der Antwort senden oder mich auf den Zähler verlassen, um zu überprüfen, ob wir alle Daten erhalten haben, oder kann ich mich einfach auf die Erkennung verlassenxhr.readyState == 4?

Auch eine teilweise Rückmeldung wäre hilfreich.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage