学习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);
答案 0 :(得分:19)
我有同样的困惑:
davecocoa 有这个在github上的nodeschool.io讨论主题上对我说。 以下是https://github.com/nodeschool/discussions/issues/346
的摘录我认为您可能会混淆两个流loud
和tr
。
tr
是主要的小号流
stdin
与其输入相关联,然后将其输出连接到stdout
我们通过要求loud
选择带有类大声的html元素来创建tr
tr
的行为是这样的,当html流式传输到它时,如果有大量类的元素,它们将从loud
输出,它们将它们发送到您为制作文本而构建的直流中大写字母,将其发送回loud
的输入,然后将其重新插入最初从tr
收到并输出的html tr
。
我想要注意的一件事是,尽管loud
与tr
有重要联系,但它们实际上根本没有连接在一起。
答案 1 :(得分:3)
我也很困惑,我会用我的话再说一遍:
tr.select('.loud').createStream()
创建了一个Duplex-Stream,它只是一个合并的ReadStream
和WriteStream
此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);
如果我错了请纠正我!