Как трубопровод поток обратно к себе работать с Труба?
Обучение node.js. Труба работает, перекачивая поток обратно в себя, по-видимому, поэтому обработанные данные могут быть выведены. Для меня это не имеет никакого смысла, поскольку, похоже, это похоже на соединение обоих концов потока с самим собой. Как труба различает данные до и после обработки? т.е. почему loud.pipe(...).pipe(loud)
не приводит к какой-либо форме бесконечного цикла обработки?
var trumpet = require('trumpet');
var through = require('through');
var tr = trumpet();
var loud = tr.select('.loud').createStream();
loud.pipe(through(function (buf) {
this.queue(buf.toString().toUpperCase());
})).pipe(loud);
process.stdin.pipe(tr).pipe(process.stdout);
Ответы
Ответ 1
У меня была такая же путаница:
davecocoa имел это, чтобы сказать мне в topicchool.io обсуждение темы на github.
Ниже выдержки из https://github.com/nodeschool/discussions/issues/346
Я думаю, вы можете ввести в заблуждение два потока loud
и tr
.
tr
- основной поток трубок
- Это поток преобразования (имеет вход и выход как трубу)
- Он принимает html как ввод
- Он выводит html
- мы подключаем
stdin
к его вводу, и мы подключаем его вывод к stdout
Мы создали loud
, предложив tr
выбрать элементы html с классом громких
- Это дуплексный поток (имеет вход и выход как телефон)
- выводит или отправляет элементы html
- он также получает элементы html
tr
ведет себя так, что, когда html передается на него, если есть элементы с классом громкие, они выводятся из loud
, который отправляет их в сквозной поток, который вы создали для создания текста в верхнем регистре, который отправляет их обратно на вкладку loud
, где они снова вставляются в html tr
, первоначально полученный и выводящий из tr
.
Я думаю, важно отметить, что, хотя loud
имеет важное соединение с tr
, они вообще не связаны друг с другом.
Ответ 2
Я тоже был смущен, и я хотел бы выразить это снова своими словами:
tr.select('.loud').createStream()
создает Дуплекс-поток, который представляет собой не что иное, как комбинированные ReadStream
и WriteStream
Этот поток получает все совпадения в ReadStream.
Если вы пишете в WriteStream, труба принимает его как match-replace
Это работает для меня таким же образом:
// create trumpet stream
var tr = trumpet();
// create stream with selected elems
var trumpetSelector = tr.select('.loud');
var upperOut = trumpetSelector.createReadStream();
var upperIn = trumpetSelector.createWriteStream();
upperOut.pipe(new UpperCaseTransformer()).pipe(upperIn);
Пожалуйста, поправьте меня, если я ошибаюсь!