2016-07-11 2 views
1

Ich verwendete einen ähnlichen Code, bis ich die Methode 'setEncoding' entdeckte. Beim Refactoring des Codes kam diese Frage zu mir.Warum kann ich in einen lesbaren Stream pushen?

readable.push(chunk, 'base64') 
readable.push(null) 
readable.pipe(res) 

Schieben Sie nicht eine Form des Schreibens von Daten? Kann ich keine Daten in einen lesbaren Stream schreiben? Ich weiß, dass alle Daten geschrieben werden müssen (sonst wäre es null) und irgendwann gelesen (oder es wird nutzlos), aber ich dachte, Node würde das von uns abstrahieren.

Könnte jemand dies für mich klären? Danke

Antwort

1

Dies kommt ins Spiel, wenn Sie einen neuen lesbaren Stream von Grund auf neu erstellen. Ein lesbarer Stream muss irgendwo beginnen und es muss eine Möglichkeit geben, Daten in diesen neuen Stream zu bekommen. Wenn Sie eine push() wie in Ihrer Frage ausführen, puffern Sie die Daten, bis sie gelesen werden. An diesem Punkt werden sie aus dem Stream entfernt und dann an das Ziel für den Verbrauch weitergeleitet. Der Verbraucher liest die Daten weiter, bis "Null" erreicht wird, was anzeigt, dass der Datenstrom fertig ist.

var stream = require('stream'); 
var readable = new stream.Readable(); // new empty stream.Readable 
readable.push('some data'); 
readable.push(null); // Done writing data 

die vollste Bild zu bekommen, wie Ströme arbeiten unter der Haube und die verschiedenen Arten von Streams, sollten Sie die Stream Handbook von Unterstapeln lesen. Das sollte alle Fragen beantworten, die Sie noch haben könnten.

+0

Nur noch eine Sache: Ist diese Art der Erstellung von Readables async? – eduardogbg

+0

Der Async-Aspekt von Node kommt nur dann zum Tragen, wenn Sie eine Operation ausführen, die I/O-gebunden ist. Knoten sind single-threaded und können nur einzelne Dinge tun, async-Operationen werden von libuv behandelt, was das Multithreading-Gefühl von node erzeugt. Dies ist jedoch keine blockierende Operation, was bedeutet, dass asynchrone Operationen während der Ausführung dieses Codes noch bearbeitet werden können. – peteb

+0

Nach dem Lesen der Dokumente, macht alles mehr Sinn: "Ende Beende den Schreiber, wenn der Leser endet. Standardmäßig auf wahr." Es gibt den Schreiber und den Leser eines Streams, und wenn der Schreiber beendet ist, können keine Daten mehr in ein Readable geschrieben werden. Das ist das Drücken von Null. – eduardogbg

Verwandte Themen