2014-05-12 84 views
0

最近,我开始学习与Nodeschool练习Node.js。但我有问题,对这个问题的理解解决方案:了解异步Javascript代码

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时遇到了问题。

+1

你应该阅读'trumpet'的文档可以[在这里找到](https://github.com/substack/node-trumpet),因为这似乎是你不理解的模块。 –

回答

0

我有一个类似的困惑,并且this discussion帮助我。


我想你可能会混淆这两个流loudtr

tr是主要的小号流

  • 它变换流(具有输入和输出等的配管)
  • 它需要HTML作为输入
  • 它输出HTML
  • 我们连接stdin到它的输入端,我们将它的输出连接到stdout

loud被另一个流,我们通过询问tr选择具有类html元素创建loudloud

  • 这是一个复式流(具有输入和输出等电话)
  • 它输出或发送的HTML元素
  • 它也接收html元素

tr的行为,使得当HTML被流式传输到它,如果有与loud类元素,它们是输出来回然后将它们发送到through您为了使文本大写而生成的流,然后将它们发送回loud的输入,然后将它们重新插入最初接收到的html tr,并从tr输出。

我猜想一个重要的事情要注意的是,虽然loudtr有重要的联系,但它们实际上并没有真正的连接在一起。


虽然trloud绝对连接,连接不说清楚,它不涉及到我们在这里看到的管道。

您确实希望将您的html发送回tr,但我们通过将其发送回loud来实现这一目标。发送到tr输入部分的任何内容都将被解释为要处理的新html,因此我们无法发送到输入tr。相反,我们发送到loud的输入,它通过一些魔术内部的小号,使它从tr输出。

这可能有助于分开想起流动的:

  • stdin>tr(它某种处理)>stdout
  • loud>through>loud

所以,当trloud都是双工流,这意味着它们同时具有输入和输出,它们的行为方式非常不同。

tr接收输入,然后发送输出作为结果。

loud发送输出,并等待输入到达。

如果您愿意,您可以将loud想象为两个流,一个读取一个写入,而不是一个读取/写入流。这使得它看起来更像stdinstdout

loudout>through>loudin

loud绝对不知道,当它接收输入,应该将它传递回TR,这恰好是内部小号,使其成为一个有点神秘