如何将流回流到自身与Trumpet一起工作?

时间:2014-06-08 07:34:58

标签: javascript node.js

学习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);

2 个答案:

答案 0 :(得分:19)

我有同样的困惑:

davecocoa 有这个在github上的nodeschool.io讨论主题上对我说。 以下是https://github.com/nodeschool/discussions/issues/346

的摘录

我认为您可能会混淆两个流loudtr

tr是主要的小号流

  • 它是一个变换流(具有像管道一样的输入和输出)
  • 以html作为输入
  • 输出html
  • 我们将stdin与其输入相关联,然后将其输出连接到stdout

我们通过要求loud选择带有类大声的html元素来创建tr

  • 它是双工流(具有像电话一样的输入和输出)
  • 输出或发送html元素
  • 它还会收到html元素

tr的行为是这样的,当html流式传输到它时,如果有大量类的元素,它们将从loud输出,它们将它们发送到您为制作文本而构建的直流中大写字母,将其发送回loud的输入,然后将其重新插入最初从tr收到并输出的html tr

我想要注意的一件事是,尽管loudtr有重要联系,但它们实际上根本没有连接在一起。


答案 1 :(得分:3)

我也很困惑,我会用我的话再说一遍:

tr.select('.loud').createStream()创建了一个Duplex-Stream,它只是一个合并的ReadStreamWriteStream

此Stream接收其ReadStream中的所有匹配。 如果您写入WriteStream,则trumpet将其视为 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);

如果我错了请纠正我!