2014-05-12 83 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,這恰好是內部小號,使其成爲一個有點神祕