最近,我开始使用Nodeschool练习学习Node.js。但是我理解这个问题的解决方案有问题:
Your program will get some html written to stdin. Convert all the inner html to
upper-case for elements with a class name of "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);
我无法理解的是这部分:
process.stdin.pipe(tr).pipe(process.stdout);
此代码不使用响亮变量来输出解决方案。有谁能解释我这个神奇的代码?
P.S:我从PHP来到Node.js,并且在理解Async Javascript方面遇到了问题。
答案 0 :(得分:0)
我有类似的困惑,this discussion帮助了我。
我认为您可能会混淆两个流loud
和tr
。
tr
是主要的小号流
stdin
与其输入相关联,然后将其输出连接到stdout
loud
是另一个流,我们通过要求loud
选择带有tr
类的html元素来创建loud
tr
的行为是这样的,当html流式传输到它时,如果有类loud
的元素,它们会从大声输出,然后将它们发送到您构建的through
流使文本大写,将它们发送回loud
的输入,然后将它们重新插入最初从tr
收到并输出的html tr
。
我想要注意的一件事是,尽管loud
与tr
有重要联系,但它们实际上根本没有连接在一起。
虽然tr
和loud
是绝对连接的,但连接并不清晰,而且与我们在此处看到的管道无关。
您确实希望将html发送回tr
,但我们会将其发送回loud
。发送到tr
的输入部分的任何内容都被解释为要处理的新html,因此我们无法发送到tr
的输入。相反,我们发送到loud
的输入,通过小号内部的一些魔法,使其从tr
输出。
分别考虑流量可能会有所帮助:
stdin
> tr
(进行某种处理)> stdout
loud
> through
> loud
因此,虽然tr
和loud
都是双工流,意味着它们同时具有输入和输出,但它们的行为方式却截然不同。
tr
收到一个输入,然后作为结果发送输出。
loud
发送输出,并等待输入到达。
如果您愿意,可以将loud
想象为两个流,一个读取和一个写入,而不是一个读/写流。这使它看起来更像stdin
和stdout
。
loudout
> through
> loudin
loud
绝对知道当它收到输入时它应该将它传回给tr,这恰好是小号的内部,使它有点神秘