2017-12-21 2 views
0

Ich kann keine knappe Antwort für eine einfache Frage finden. Hoffentlich wird es so sein.Pipe lesbarer Stream zu 2 beschreibbaren Streams

Ich möchte einfach, dies zu tun:

let myReadableStream = ...some readable stream...; 
let myFileStream = ...some writable file stream...; 

myReadableStream.pipe(process.stdout).pipe(myFileStream); 

Dies gilt nicht als beschreibbar Ströme funktionieren nicht entlang geleitet werden kann.

Diese Art der Arbeiten:

let myReadableStream = ...some readable stream...; 
let myFileStream = ...some writable file stream...; 

myReadableStream.pipe(process.stdout); 
myReadableStream.pipe(myFileStream); 

Aber nicht das zu Problemen führen, wenn das lesbare Rohr schnell vor den zweiten myReadableStream.pipe(myFileStream) mit Daten füllt erreicht ist?

Was ist der kanonische Weg, dies mit Rohren zu tun?

Antwort

1

Wie ich node.js Streams verstehen, beginnen sie nicht sofort beim Aufruf der pipe() Funktion zu starten, die Arbeit ist zurück in Sie zurück auf die event loop zurückgeben. Also, nichts wird zwischen den beiden pipe() Anrufe passieren.

Ich weiß, dass dies für Menschen (wie mich), die aus einer Umgebung stammen, die auf mehreren Anwendungsthreads basiert, kontraintuitiv wirkt. Aber mehrere Threads ist nicht das JavaScript-Modell der Nebenläufigkeit. Die asynchrone JavaScript-Ausführung basiert stattdessen auf einem einfacher zu verwaltenden EventLoop-Modell, bei dem die asynchrone Rückrufbehandlung nur auftritt, wenn anderer Anwendungscode inaktiv ist. Das große Plus davon ist, dass keine Sperren erforderlich sind, die in einem Thread-Ausführungsmodell manchmal nur schwer zu erreichen sind.

Verwandte Themen