Завершить запись потока - PullRequest
0 голосов
/ 11 февраля 2019

Я использую gulp для обработки, минимизации и связывания моих css-файлов (и js тоже).Но я не хочу писать файл сразу.Я хочу проверить, не совпадает ли сумма md5 обработанного содержимого с суммой md5 существующей версии связанного файла, и писать только в этом случае.

Вместо того, чтобы сразу же написать файл, который я пытаюсь получить, является строкой изпроцесс.

Но конструкция не работает.

const Stream = require('stream');
const writableStream = new Stream.Writable({ objectMode: true });

var file = "";

writableStream._write = (chunk, encoding, next) => {
    file += chunk.contents.toString();
    next();
}

let bundlePipe = gulp.src([...vendorLinks.map(e => path.resolve(htmlPath + e)), ...resourceLinks.map(e => path.resolve(htmlPath + e))], { sourcemaps: true })
    .pipe(postcss([cssnext, cssnano]))
    .pipe(concat("style.bundle.min.css"))
    .pipe(writableStream);
    //.pipe(gulp.dest(path.resolve(paths["html/static/css"]))); 


bundlePipe.on("end", () => {
    // It never goes there!
    console.log("get file contents", file); 
}

Кажется, что writeableStream, который я создаю, не знает, что все данные уже переданы ему, и никогда не выдает сигнал завершения.

Что я могу сделать, чтобы writeableStream закрывался после получения всех данных из канала?

1 Ответ

0 голосов
/ 11 февраля 2019

Доступные для записи потоки не излучают end, только читаемые потоки генерируют событие такого типа.

Эквивалент для записываемого потока - finish.Вы можете найти подробности об этом событии в документации Node.js.

Причина, по которой читаемые и записываемые потоки имеют разные события, сигнализирующие об их окончании / завершении, состоит в том, что существуюттакже гибридные потоки (такие как DuplexStream), которые состоят из читаемого потока и потока с возможностью записи одновременно, и, следовательно, вы должны иметь возможность различаться между событиями одного и другого типа.

...