2017-02-08 5 views
1

Ich habe einen http-Server, der, auf Client-Anfrage, eine bestimmte Aufgabe im Hintergrund läuft, die ein wenig dauern kann, bevor es die Ergebnisse an den Client zurückgibt.http benutzerdefinierte Fortschritt Rückmeldung an Client

Gibt es eine Möglichkeit, den Client mit Fortschrittsinformationen zu dieser bestimmten Hintergrundaufgabe zu aktualisieren?

Es gibt den Fortschrittshandler von XMLHttpRequest, aber wenn ich es richtig verstehe, wird es nur für den Datentransfer verwendet.

In meiner Anwendung ist ein Beispiel eines Flusses ist dies:

  1. Client sendet Anforderung GET.
  2. Server macht Dinge, die Zeit brauchen können. Wie aktualisiert der Kunde den Fortschritt der Dinge?
  3. Server gibt eine Antwort an den Client zurück. Abhängig von der Datengröße, kann auch Zeit brauchen. XMLHttpRequest-Fortschrittsereignis kann hier verwendet werden.

Ist dieser Teil der http-Spezifikation? Oder brauche ich noch etwas anderes (Websocket ..?)

danke!

Antwort

0

Sie sollten in Betracht ziehen, server-sent events zu verwenden. Hier sind einige Orte, um mehr darüber zu erfahren:

Server gesendet Veranstaltungen sind und dort sind polyfills you can use to make server-sent events work in Edge/IE als auch, und sogar eine .

Hier ist ein sehr einfaches Beispiel für einige clientseitigen Code:

var source = new EventSource("/server-side-app-that-gives-progress-updates") 
source.onmessage = function(e) { 
    console.log(e.data); 
} 

Auf der Serverseite, Ihre /server-side-app-that-gives-progress-updates App sendet nur Klartext-Daten wie folgt formatiert zurück:

data: some data\n 
data: more data\n\n 

Es Beginnt das Streaming, indem Sie eine Antwort mit einem Header Content-Type: text/event-stream senden. Der Client-Code oben sieht es als eine einzige e.data Nachricht mit "some data\more data".

Wenn die Server-App eine Aktualisierung hat, schreibt sie einfach eine andere Nachricht dieses Formulars in die Antwort.

Wenn Sie die Updates als eine Reihe von JSON-Nachrichten stattdessen senden möchten, Ihre Server-Anwendung schreibt:

data: {"foo": "bar", "hoge": "moge"}\n\n 

und dann Client-Code kann dies tun:

source.onmessage = function(e) { 
    var jsonObject = JSON.parse(e.data); 
    console.log(jsonObject.foo); 
} 

Natürlich gibt es mehr dazu können Sie an den oben genannten Orten erfahren. Aber das ist es in aller Kürze.


Ich habe einen http-Server, die auf Client-Anfrage, läuft eine bestimmte Aufgabe in den Hintergrund, die ein wenig Zeit in Anspruch nehmen können, bevor es die Ergebnisse an den Client zurückzugibt.

Das ist einer der wichtigsten Anwendungsfälle, für die serverseitige Ereignisse entwickelt wurden.

Gibt es eine Möglichkeit, den Client mit Fortschrittsinformationen zu diesem spezifischen Hintergrund-Task zu aktualisieren?

Ja, Sie können das mit serverseitigen Ereignissen tun.

Es ist der Fortschritt-Handler von XMLHttpRequest, aber wenn ich verstehe richtig ist es nur für die Datenübertragung Fortschritt verwendet.

Richtig. XHR kann keine Fortschrittsinformationen zu irgendetwas auf dem Server erhalten, bevor es antwortet.

In meiner Anwendung ist ein Beispiel eines Flusses ist dies:

Ist dieser Teil der http-Spezifikation?

Es ist nicht Teil der HTTP-Spezifikation (obwohl HTTP/2 etwas verwandte Funktionen hat).

Oder muss ich etwas anderes (websocket ..?)

Sie brauchen nicht WebSockets dafür. WebSockets eignen sich hervorragend für den Fall, dass Sie echte Zwei-Wege-Vollduplex-Kommunikation zwischen Client und Server benötigen, z. B. eine Echtzeit-Chat-App.

Aber der in der Frage beschriebene Anwendungsfall ist stattdessen einer, wo nur One-Way-Kommunikation von Updates vom Server an den Client benötigt wird. Und genau dafür sind serverseitige Ereignisse gedacht.