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

首頁 > 編程 > JavaScript > 正文

NodeJS實現自定義流的方法

2019-11-19 13:21:56
字體:
來源:轉載
供稿:網友

前言

常見的自定義流有四種,Readable(可讀流)、Writable(可寫流)、Duplex(雙工流)和 Transform(轉換流),常見的自定義流應用有 HTTP 請求、響應, crypto 加密,進程 stdin 通信等等。

stream 模塊介紹

在 NodeJS 中要想實現自定義流,需要依賴模塊 stream ,直接引入,不需下載,所有種類的流都是繼承這個模塊內部提供的對應不同種類的類來實現的。

實現一個自定義可讀流 Readable

1、創建自定義可讀流的類 MyRead

實現自定義可讀流需創建一個類為 MyRead ,并繼承 stream 中的 Readable 類,重寫 _read 方法,這是所有自定義流的固定套路。

let { Readable } = require("stream");// 創建自定義可讀流的類class MyRead extends Readable { constructor() { super(); this.index = 0; } // 重寫自定義的可讀流的 _read 方法 _read() { this.index++; this.push(this.index + ""); if (this.index === 3) {  this.push(null); } }}

我們自己寫的 _read 方法會先查找并執行,在讀取時使用 push 方法將數據讀取出來,直到 push 的值為 null 才會停止,否則會認為沒有讀取完成,會繼續調用 _read 。

2、驗證自定義可讀流

let myRead = new MyRead();myRead.on("data", data => { console.log(data);});myRead.on("end", function() { console.log("讀取完成");});// <Buffer 31>// <Buffer 32>// <Buffer 33>// 讀取完成

實現一個自定義可寫流 Writable

1、創建自定義可寫流的類 MyWrite

創建一個類名為 MyWrite ,并繼承 stream 中的 Writable 類,重寫 _write 方法。

let { Writable } = require("stream");// 創建自定義可寫流的類class MyWrite extends Writable { // 重寫自定義的可寫流的 _write 方法 _write(chunk, encoding, callback)) { callback(); // 將緩存區寫入文件 }}

寫入內容時默認第一次寫入直接寫入文件,后面的寫入都寫入緩存區,如果不調用 callback 只能默認第一次寫入文件,調用 callback 會將緩存區清空并寫入文件。

2、驗證自定義可寫流

let myWrite = new MyWrite();myWrite.write("hello", "utf8", () => { console.log("hello ok");});myWrite.write("world", "utf8", () => { console.log("world ok");});// hello ok// world ok

實現一個自定義雙工流 Duplex

1、創建自定義可雙工流的類 MyDuplex

雙工流的可以理解為即可讀又可寫的流,創建一個類名為 MyDuplex ,并繼承 stream 中的 Duplex 類,由于雙工流即可讀又可寫,需重寫 _read 和 _write 方法。

let { Duplex } = require("stream");// 創建自定義雙工流的類class MyDuplex extends Duplex { // 重寫自定義的雙工流的 _read 方法 _read() { this.push("123"); this.push(null); } // 重寫自定義的雙工流的 _write 方法 _write(chunk, encoding, callback)) { callback(); }}

雙工流分別具備 Readable 和 Writable 的功能,但是讀和寫互不影響,互不關聯。

2、驗證自定義雙工流

let myDuplex = new MyDuplex();myDuplex.on("readable", () => { console.log(myDuplex.read(1), "----");});setTimeout(() => { myDuplex.on("data", data => { console.log(data, "xxxx"); });}, 3000);// <Buffer 31> ----// <Buffer 32> xxxx// <Buffer 32> ----// <Buffer 33> xxxx

如果 readable 和 data 兩種讀取方式都使用默認先通過 data 事件讀取,所以一般只選擇一個,不要同時使用,可讀流的特點是讀取數據被消耗掉后就丟失了(緩存區被清空),如果非要兩個都用可以加一個定時器(絕對不要這樣寫)。

實現一個自定義轉化流 Transform

1、創建自定義可轉化流的類 MyTransform

轉化流的意思是即可以當作可讀流,又可以當作可寫流,創建一個類名為 MyTransform ,并繼承 stream 中的 Transform 類,重寫 _transform 方法,該方法的參數和 _write 相同。

let { Transform } = require('stream');// 創建自定義轉化流的類class MyTransform extends Transform { // 重寫自定義的轉化流的 _transform 方法 _transform(chunk, encoding, callback)) {  console.log(chunck.toString.toUpperCase());  callback();  this.push('123'); }}

在自定義轉化流的 _transform 方法中,讀取數據的 push 方法和 寫入數據的 callback 都可以使用。

2、驗證自定義轉化流

// demo.jslet myTransForm = new MyTransform();// 使用標準輸入process.stdin.pipe(myTransForm).pipe(process.stdin);

打開命令行窗口執行 node demo.js ,然后輸入 abc ,會在命令窗口輸出 ABC 和 123 ,其實轉換流先作為一個可寫流被寫入到標準輸入中,而此時 stdin 的作用是讀流,即讀取用戶的輸入,讀取后轉換流作為一個可讀流調用 pipe ,將用戶輸入的信息通過標準輸出寫到命令行窗口,此時 stdout 的作用是寫流。

總結

以上所述是小編給大家介紹的NodeJS實現自定義流,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 廊坊市| 金川县| 永平县| 大宁县| 安西县| 彰化市| 北宁市| 邵阳市| 惠来县| 澳门| 乐安县| 澄城县| 礼泉县| 澳门| 武邑县| 贡山| 马鞍山市| 洛宁县| 呼和浩特市| 册亨县| 湖北省| 彝良县| 商城县| 四子王旗| 麻阳| 抚州市| 梁河县| 元氏县| 贡嘎县| 汶上县| 钦州市| 科技| 沧州市| 扶余县| 德化县| 长垣县| 韶关市| 安阳县| 平阳县| 保德县| 水富县|