溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

NodeJS如何實現(xiàn)自定義流的方法

發(fā)布時間:2021-04-20 10:58:50 來源:億速云 閱讀:216 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關NodeJS如何實現(xiàn)自定義流的方法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

JS是什么

JS是JavaScript的簡稱,它是一種直譯式的腳本語言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,主要用于web的開發(fā),可以給網站添加各種各樣的動態(tài)效果,讓網頁更加美觀。


NodeJS如何實現(xiàn)自定義流的方法

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

stream 模塊介紹

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

實現(xiàn)一個自定義可讀流 Readable

1、創(chuàng)建自定義可讀流的類 MyRead

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

let { Readable } = require("stream");

// 創(chuàng)建自定義可讀流的類
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 方法會先查找并執(zhí)行,在讀取時使用 push 方法將數(shù)據讀取出來,直到 push 的值為 null 才會停止,否則會認為沒有讀取完成,會繼續(xù)調用 _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>
// 讀取完成

實現(xiàn)一個自定義可寫流 Writable

1、創(chuàng)建自定義可寫流的類 MyWrite

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

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

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

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

實現(xiàn)一個自定義雙工流 Duplex

1、創(chuàng)建自定義可雙工流的類 MyDuplex

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

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

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

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 事件讀取,所以一般只選擇一個,不要同時使用,可讀流的特點是讀取數(shù)據被消耗掉后就丟失了(緩存區(qū)被清空),如果非要兩個都用可以加一個定時器(絕對不要這樣寫)。

實現(xiàn)一個自定義轉化流 Transform

1、創(chuàng)建自定義可轉化流的類 MyTransform

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

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

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

2、驗證自定義轉化流

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

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

感謝各位的閱讀!關于“NodeJS如何實現(xiàn)自定義流的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI