国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

淺析Node.js的Stream模塊中的Readable對象

2019-11-20 11:58:13
字體:
來源:轉載
供稿:網友

我一直都很不愿意扯 nodejs 的流,因為從第一次看到它我就覺得它的設計實在是太惡心了。但是沒辦法,Stream 規范尚未普及,而且確實有很多東西都依賴了 nodejs 的流來實現的,所以我也只能捏著鼻子硬著頭皮來扯一扯這又臭又硬的 nodejs 流對象了。
  nodejs 自帶了一個叫 stream 的模塊,引入它便可以得到一組流對象構造器。現在我只說最簡單的 stream.Readable。
  其實用過 nodejs 的幾乎都接觸過 Readable 的實例,只是平時沒太在意而已。一個非常典型的例子,http 模塊中我們處理每個請求時都會有 req 和 res 對象,req 其實就是一個 Readable 對象。我們可以在這個 req 上以流的形式讀到 HTTP 請求的實體部分。
  那么問題來了,為什么 http 模塊要在此處以流的方式設計呢?或者從另一個維度來問這個問題就是「nodejs 如果獲取 POST 請求的內容?」。懂得用搜索引擎的同學肯定可以很容易地找到這么一個答案:監聽 data 事件收集數據,在 end 事件中把收集到的數據合并起來。是的,這是解決這個問題的方法。但是為什么它如此設計呢?像 PHP 那樣直接就可以取到 POST 內容多好?其實這么設計是有好處的,如果我們接收到的數據是非法的,我可以馬上察覺,然后響應并斷開連接。這樣可以避免一些不必要的傳輸成本。比如上傳圖片,也許用戶錯誤地選擇了一個很大的可執行文件,我們不需要等到這個文件完全上傳完畢,只要一個文件頭部的若干字節就能判斷一個文件是否是圖片了。此處使用流的設計就可以先讀出前面的幾個字節來使用。
  上面提到的 data 事件和 end 事件都是 Readable 的事件,這兩個事件分別表示收到數據和數據接收完畢。所以其實我們早已知道了 Readable 的用法,只是很多人不知道它是 Readable 對象而已。
  但是上面這兩個事件僅僅是對 Readable 的消費者而言的事件。內部是如何把一個數據推送到 Readable 對象里面讓 Readable 觸發出這些事件的呢?那么它就是 push 方法。下面是一個例子,它創建了一個 Readable 對象,這個對象會流出一個遞增的數字(這里使用了 babel-node)

import stream from 'stream';var r = new stream.Readable;r.on('data', data => { console.log(data + '');});r.on('end', data => { console.log('end');});r._read = () => { // console.log('before read');};void function callee(i) { if(i < 10) {  r.push(i + ''); // 只能傳入字符串或 Buffre 對象 } else {  r.push(null); // 當輸入一個 null 時表示流傳輸完成,觸發 end 事件  } setTimeout(callee, 500, i + 1);}(0);

  如果仔細看上面代碼就會發現一個很神奇的地方,這個代碼覆寫了 _read 方法,這是什么鬼?其實我也覺得這是個坑,這個私有命名風格就不吐槽了,為何非要覆寫這個方法才算實現它?如果沒有覆寫這個方法,那么在調用 push 時將拋出異常:

 Error: not implemented  at Readable._read (_stream_readable.js:464:22)  at Readable.read (_stream_readable.js:341:10)

  以上這些便是 Readable 對象的基本用法。但是還有更多坑會踩到,這篇文章只是一個最簡單的介紹,讓大家學會如何造出一個能輸出數據的 Readable 對象而已。至于一些 read 之類的基本方法,反正這些也是不科學的設計之一。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 靖边县| 海林市| 陇西县| 报价| 奎屯市| 庆城县| 郑州市| 镇康县| 瑞安市| 曲水县| 咸阳市| 玉林市| 静乐县| 会昌县| 桑植县| 瑞金市| 兴业县| 尚志市| 英超| 丰镇市| 壤塘县| 厦门市| 加查县| 九龙城区| 绥宁县| 南城县| 屏东县| 南投市| 焉耆| 普兰县| 大厂| 泸水县| 天水市| 邢台县| 灵丘县| 黄冈市| 蒲城县| 和田市| 平江县| 晋江市| 方正县|