理解Async Javascript代码

Understanding Async Javascript code

本文关键字:代码 Javascript Async 理解      更新时间:2023-09-26

最近,我开始通过nodesschool练习学习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);

此代码没有使用loud变量来输出解决方案。谁能解释一下这个神奇的密码?

p。S:我是从PHP开始学习Node.js的,在理解Async Javascript方面有一些问题。

我也有类似的困惑,这次讨论帮我解决了这个问题。


我想你可能混淆了两个流loudtr

tr为主要喇叭流

  • 是一个转换流(像管道一样有输入和输出)
  • 它接受html作为输入
  • 输出html
  • stdin连接到其输入端,将其输出端连接到stdout

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

  • 它是一个双工流(像电话一样有输入和输出)
  • 输出或发送html元素
  • 它也接收html元素

tr的行为是这样的,当html流到它时,如果有类loud的元素,它们是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,这恰好是小号的内部,使它有点神秘