Обнаружение конца потока в streams2

#node.js #coffeescript #gulp #node.js-stream

#node.js #coffeescript #глоток #node.js-поток

Вопрос:

Я только что прочитал, что если поток использует 'data' или 'end' прослушивает, он переключается в «классический» режим, а в потоковом справочнике говорится:

Обратите внимание, что всякий раз, когда вы регистрируете прослушиватель «данных», вы переводите поток в режим совместимости, поэтому вы теряете преимущества нового API streams2

Итак, каков наилучший способ использовать преимущества нового API streams? Если я сейчас делаю это:

 gulp.src(["./src/server/**/*.coffee"])
    .pipe(coffee  bare: true ).on("error", gutil.log)
    .pipe(gulp.dest "./bin/server")
    .on 'end',-> gutil.log "successfully compiled server coffeescript"
 

Как я могу сделать то же самое без регистрации 'end' слушателя

Ответ №1:

Только вызов .resume() / .pause() или добавление прослушивателя «данных» переключит поток streams2 на поток streams1. Вы можете прослушивать ‘end’, ничего не затрагивая.

В вашем конкретном примере, даже если бы он переключился, это не повлияло бы на вас, поскольку вы просто выполняете конвейер, который работает как в режимах streams1, так и streams2.

Кроме того, вы можете не увидеть событие ‘end’, если этот последний поток ( gulp.dest "./bin/server" ) не является дуплексным потоком или вы не используете данные из него. Если это только поток, доступный для записи, вам следует вместо этого прослушать ‘finish’ (‘end’ выдается только для читаемых потоков).

Комментарии:

1. Да, но что мне делать, если в потоке вообще нет 'end' события? Есть ли способ определить его конец?

2. Если этот последний stream ( gulp.dest "./bin/server" ) является только потоком, доступным для записи, тогда вам следует вместо этого прослушать ‘finish’. ‘end’ предназначен только для читаемых потоков.

3. изменение on 'end' на on 'finish' не сработало для меня

4. Попробуйте добавить .resume() после вашего .on 'end' / .on 'finish' обработчика. Оказывается, это gulp.dest возвращает дуплексный поток (позволяющий вам передавать другие потоки gulp), который необходимо будет удалить, чтобы получить искомые события, и вызов resume() — это простой способ сделать это.