了解异步Javascript代码

时间:2014-05-12 03:59:49

标签: javascript node.js

最近,我开始使用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方面遇到了问题。

1 个答案:

答案 0 :(得分:0)

我有类似的困惑,this discussion帮助了我。


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

tr是主要的小号流

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

loud是另一个流,我们通过要求loud选择带有tr类的html元素来创建loud

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

tr的行为是这样的,当html流式传输到它时,如果有类loud的元素,它们会从大声输出,然后将它们发送到您构建的through流使文本大写,将它们发送回loud的输入,然后将它们重新插入最初从tr收到并输出的html 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,这恰好是小号的内部,使它有点神秘