什麼是流?
說到流,就涉及到一個*nix的概念:管道——在*nix中,流在Shell中被實現為可以通過|(管道符) 進行橋接的數據,一個進程的輸出(stdout)可直接作為下一個進程的輸入(stdin)。
在Node中,流(Stream)的概念與之類似,代表一種資料流可供橋接的能力。
pipe
流化的精髓在於 .pipe()方法。可供橋接的能力,在於資料流的兩端(上游/下游 或稱為 讀/寫流)以一個 .pipe()方法進行橋接。
偽代碼的表現形式為:
//上游.pipe(下游)
Readable.pipe(Writable);
流的分類
這裡並不打算討論所謂的Node v0.4 之前的「經典」流。那麼,流分為這麼幾類(皆為抽象介面:
1.stream.Readable 可讀流(需要實作_read方法,重點在於資料流讀取的細部
2.stream.Writable 可寫流(需要實作_write方法,重點在於資料流寫入的細節
3.stream.Duplex 可讀/寫流(上兩個接口,關注點以上為兩個接口的細部
4.stream.Transform 繼承自Duplex(需要實作_transform方法,重點在於資料區塊的處理
簡單來說:
1).pipe() 的擁有者一定具備Readable 流(並不局限於)能力,它擁有'readable'/'data'/'end'/'close'/'error' 一系列事件可供訂閱,也提供.read()/.pause()/.resume()等一系列方法供呼叫;
2).pipe() 的參數一定具備Writable 流(並不局限於)能力,它擁有'drain'/'pipe'/'unpipe'/'error'/'finish' 事件可供訪問,也提供.write ()/.end() 等一系列方法供呼叫
什麼鬼
有沒有一絲絲焦慮?別急,做為一個說人話的低級碼工,我會把Stream掰開了和您扯一扯的。
Stream類,在 Node.js的源碼 裡,是這麼定義的:
var EE = require('events').EventEmitter;
var util = require('util');
util.inherits(Stream, EE);
function Stream() {
EE.call(this);
}
可以看出,本質上,Stream是一個EventEmitter,那意味著它具備事件驅動的功能(.emit/.on...)。眾所周知,“Node.js 就是基於V8的事件驅動平台”,實現了事件驅動的流式編程,具備了和Node一樣的異步回調的特徵。
例如在Readable 流中,有一個readable 事件,在一個暫停的唯讀流中,只要有資料塊準備好可讀時,它就會被發送給訂閱者(Readable 流有哪些呢?express中的req,ftp或mutli-form上傳元件的req.part,系統中的標準輸入process.stdin等)。有了readable 事件,我們可以做個處理shell 指令輸出的分析器之類的工具:
process.stdin.on('readable', function(){
var buf = process.stdin.read();
if(buf){
var data = buf.toString();
// parsing data ... }
});
這樣呼叫:
head -10 some.txt | node parser.js
對於 Readable 流,我們還可以訂閱它的 data 和 end 事件,以獲取資料塊並在流枯竭時獲得通知,如 經典socket示例 中那樣:
req.on('connect', function(res, socket, head) {
socket.on('data', function(chunk) {
console.log(chunk.toString());
});
socket.on('end', function() {
proxy.close();
});
});
Readable流狀態的切換
要注意的是,Readable 流有兩種狀態:flowing mode(激流) 和 pause mode(暫停)。前者根本停不下來,誰被pipe上了就馬上不停的給;後者會暫停,直到下游顯式的呼叫 Stream.read() 請求才讀取資料塊。 Readable 流初始化時是 pause mode的。
這兩種狀態可以互為切換的,其中,
有以下任一行為,pause 轉 flowing:
1.對 Readable 流新增一個data事件訂閱
2.對 Readable 呼叫 .resume() 明確開啟flowing
3.呼叫 Readable 流的 .pipe(writable) ,橋接到一個 Writable 流上
有以下任一行為,flowing 轉回 pause:
1.Readable 流還沒有 pipe 到任何流上,可調 .pause() 暫停
2.Readable 流已經 pipe 到了流上,需 remove 掉所有 data 事件訂閱,並且調用 .unpipe()方法逐一解除與下游流的關係
妙用
結合流的非同步特性,我可以寫出這樣的應用:直接將 用戶A 的輸出橋接到 用戶B 的頁面上輸出:
router.post('/post', function(req, res) {
var destination = req.headers['destination']; //發給誰
cache[destionation] = req;
//是的,不返回,所以最好是個ajax請求
});
用戶B請求的時候:
router.get('/inbox', function(req, res){
var user = req.headers['user'];
cache.find(user, function(err, previousReq){ //找到先前存的req
var form = new multiparty.Form();
form.parse(previousReq); // 有文件給我
form.on('part', function (part) {
part.pipe(res); //流式大法佳:)
part.on('error', function (err) {
console.log(err);
messaging.setRequestDone(uniqueID);
return res.end(err);
});
});
});
});
參考
how to write node programs with streams: stream-handbook

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)