Angenommen, ich habe eine Datei mit einer Liste von ganzen Zahlen, eine pro Zeile. Ich verwende fs.createReadStream
und pipe das in split
(so dass jeder Chunk eine ganze Zahl ist). Dann piped ich das in einen Duplex-Strom, der die Zahlen hinzufügen soll, und schreibe die Summe durch Piping in fs.createWriteStream
.warten Sie, bis der vorherige Stream leer ist, bevor Sie lesen können
var fs = require('fs');
var stream = require('stream');
var split = require('split');
var addIntegers = new stream.Duplex();
addIntegers.sum = 0;
addIntegers._read = function(size) {
this.push(this.sum + '\n');
}
addIntegers._write = function(chunk, encoding, done) {
this.sum += +chunk;
done();
}
fs.createReadStream('list-of-integers.txt')
.pipe(split())
.pipe(addIntegers)
.pipe(fs.createWriteStream('sum.txt'));
Als ich dies ausführen, wird mit Nullen und das Programm nie beendet sum.txt
nur ständig gefüllt (wie erwartet). Wie warte ich darauf, dass der Eingabestrom (split
) leer ist, bevor der Ausgabestrom (fs.createWriteStream
) von addIntegers
gelesen werden kann?
Warum nicht 'push()' 'innen _write()' statt? – mscdex
Hmm ja, ich könnte einen Transformations-Stream verwenden und 'this.push (this.sum + '\ n')' in '_write'. Ich bekomme eine laufende Summe, die für immer viel besser ist als Nullen. Gibt es jedoch eine Möglichkeit, die Gesamtsumme zu bekommen? (einmal in 'sum.txt' statt n mal schreiben?). Ich weiß, dass ich hinterher nur 'sum.txt' schreiben kann, aber ich habe mich gefragt, ob es eine idiomatische' Knoten'-Methode gibt, um zu bekommen, was ich will. – aeoliant