Как трубопровод поток обратно к себе работать с Труба?

Обучение 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);

Пожалуйста, поправьте меня, если я ошибаюсь!