Подскажите пожалуйста, как распечатать пространство в файле после того, как потоковый конвейер полностью заработает в nodeJS - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть простой код, который создает читаемый поток и направляет его в поток для записи и подсчитывает пробелы в файле. Моя логика c кажется правильной. Проблема в том, что перед вычислением места она печатается.

var fs=require('fs');
var inStream=fs.createReadStream('data.txt');
var outStream=fs.createWriteStream('out.txt');
var printStream=process.stdout;
var space=0;
var upperStream=new Transform({
    transform(chunck,enc,cb){
        var text=chunck.toString().toUpperCase();
        for (var i=0;i<text.length;i++)
            if(text[i]==' ')
                space++;
        this.push(text);
        cb();
    }
});
inStream.pipe(upperStream).pipe(printStream);
console.log("Number of space in file : ",space);    

data.txt содержит 'Standard error'

1 Ответ

0 голосов
/ 29 апреля 2020

Это потому, что ваш код для подсчета пробелов является асин c кодом. Вы должны обработать событие instream end. Событие end будет отправлено, когда данные полностью прочитаны из instream. Как только подсчет пространства завершен, а данные записаны в printstream и полностью использованы из instream, только вы сможете получить фактический подсчет пространства.

Также вы пропустили требование потока Transform.

var { Transform } = require('stream');
var fs=require('fs');
var inStream=fs.createReadStream('data.txt');
var outStream=fs.createWriteStream('out.txt');
var printStream=process.stdout;
var space=0;
var upperStream=new Transform({
    transform(chunck,enc,cb){
        var text=chunck.toString().toUpperCase();
        for (var i=0;i<text.length;i++)
            if(text[i]==' ')
                space++;
        this.push(text);
        cb();
    }
});
inStream.pipe(upperStream).pipe(printStream);

inStream.on('end', () => console.log(`Number of space in file : ${space}`));  

Подробнее о потоковых событиях читайте здесь: https://nodejs.org/api/stream.html

...