Скажем, у меня есть файл, содержащий список целых чисел, по одному на строку. Я использую fs.createReadStream
и передаю его в split
(так что каждый кусок является целым числом). Затем я передаю это в дуплексный поток, который должен добавить числа и записать сумму по трубопроводу в fs.createWriteStream
.подождите, пока предыдущий поток будет пустым, прежде чем разрешить чтение
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'));
Когда я запускаю это, sum.txt
просто получает постоянно заполняются нулями, и программа никогда не заканчивается (как и ожидалось). Как подождать, пока входной поток (split
) будет пустым, прежде чем разрешить поток вывода (fs.createWriteStream
) читать с addIntegers
?
Почему бы не 'push()' in '_write()' вместо этого? – mscdex
Хмм да, я мог бы использовать поток преобразования и 'this.push (this.sum + '\ n')' в '_write'. Я получаю текущую сумму, которая намного лучше, чем нули навсегда. Однако есть ли способ получить общую сумму? (пишите один раз в 'sum.txt' вместо n раз?). Я понимаю, что после этого могу просто «tail -n 1 sum.txt», но мне было интересно, есть ли идиоматический способ «узла» получить то, что я хочу. – aeoliant