這篇文章給大家分享的是有關(guān)NodeJS如何實(shí)現(xiàn)自定義流的方法的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站與策劃設(shè)計(jì),港口網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:港口等地區(qū)。港口做網(wǎng)站價(jià)格咨詢:13518219792
JS是JavaScript的簡(jiǎn)稱,它是一種直譯式的腳本語(yǔ)言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,主要用于web的開發(fā),可以給網(wǎng)站添加各種各樣的動(dòng)態(tài)效果,讓網(wǎng)頁(yè)更加美觀。
常見的自定義流有四種,Readable(可讀流)、Writable(可寫流)、Duplex(雙工流)和 Transform(轉(zhuǎn)換流),常見的自定義流應(yīng)用有 HTTP 請(qǐng)求、響應(yīng), crypto 加密,進(jìn)程 stdin 通信等等。
stream 模塊介紹
在 NodeJS 中要想實(shí)現(xiàn)自定義流,需要依賴模塊 stream ,直接引入,不需下載,所有種類的流都是繼承這個(gè)模塊內(nèi)部提供的對(duì)應(yīng)不同種類的類來(lái)實(shí)現(xiàn)的。
實(shí)現(xiàn)一個(gè)自定義可讀流 Readable
1、創(chuàng)建自定義可讀流的類 MyRead
實(shí)現(xiàn)自定義可讀流需創(chuàng)建一個(gè)類為 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 方法會(huì)先查找并執(zhí)行,在讀取時(shí)使用 push 方法將數(shù)據(jù)讀取出來(lái),直到 push 的值為 null 才會(huì)停止,否則會(huì)認(rèn)為沒(méi)有讀取完成,會(huì)繼續(xù)調(diào)用 _read 。
2、驗(yàn)證自定義可讀流
let myRead = new MyRead(); myRead.on("data", data => { console.log(data); }); myRead.on("end", function() { console.log("讀取完成"); }); // <Buffer 31> // <Buffer 32> // <Buffer 33> // 讀取完成
實(shí)現(xiàn)一個(gè)自定義可寫流 Writable
1、創(chuàng)建自定義可寫流的類 MyWrite
創(chuàng)建一個(gè)類名為 MyWrite ,并繼承 stream 中的 Writable 類,重寫 _write 方法。
let { Writable } = require("stream"); // 創(chuàng)建自定義可寫流的類 class MyWrite extends Writable { // 重寫自定義的可寫流的 _write 方法 _write(chunk, encoding, callback)) { callback(); // 將緩存區(qū)寫入文件 } }
寫入內(nèi)容時(shí)默認(rèn)第一次寫入直接寫入文件,后面的寫入都寫入緩存區(qū),如果不調(diào)用 callback 只能默認(rèn)第一次寫入文件,調(diào)用 callback 會(huì)將緩存區(qū)清空并寫入文件。
2、驗(yàn)證自定義可寫流
let myWrite = new MyWrite(); myWrite.write("hello", "utf8", () => { console.log("hello ok"); }); myWrite.write("world", "utf8", () => { console.log("world ok"); }); // hello ok // world ok
實(shí)現(xiàn)一個(gè)自定義雙工流 Duplex
1、創(chuàng)建自定義可雙工流的類 MyDuplex
雙工流的可以理解為即可讀又可寫的流,創(chuàng)建一個(gè)類名為 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 的功能,但是讀和寫互不影響,互不關(guān)聯(lián)。
2、驗(yàn)證自定義雙工流
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 兩種讀取方式都使用默認(rèn)先通過(guò) data 事件讀取,所以一般只選擇一個(gè),不要同時(shí)使用,可讀流的特點(diǎn)是讀取數(shù)據(jù)被消耗掉后就丟失了(緩存區(qū)被清空),如果非要兩個(gè)都用可以加一個(gè)定時(shí)器(絕對(duì)不要這樣寫)。
實(shí)現(xiàn)一個(gè)自定義轉(zhuǎn)化流 Transform
1、創(chuàng)建自定義可轉(zhuǎn)化流的類 MyTransform
轉(zhuǎn)化流的意思是即可以當(dāng)作可讀流,又可以當(dāng)作可寫流,創(chuàng)建一個(gè)類名為 MyTransform ,并繼承 stream 中的 Transform 類,重寫 _transform 方法,該方法的參數(shù)和 _write 相同。
let { Transform } = require('stream'); // 創(chuàng)建自定義轉(zhuǎn)化流的類 class MyTransform extends Transform { // 重寫自定義的轉(zhuǎn)化流的 _transform 方法 _transform(chunk, encoding, callback)) { console.log(chunck.toString.toUpperCase()); callback(); this.push('123'); } }
在自定義轉(zhuǎn)化流的 _transform 方法中,讀取數(shù)據(jù)的 push 方法和 寫入數(shù)據(jù)的 callback 都可以使用。
2、驗(yàn)證自定義轉(zhuǎn)化流
// demo.js let myTransForm = new MyTransform(); // 使用標(biāo)準(zhǔn)輸入 process.stdin.pipe(myTransForm).pipe(process.stdin);
打開命令行窗口執(zhí)行 node demo.js ,然后輸入 abc ,會(huì)在命令窗口輸出 ABC 和 123 ,其實(shí)轉(zhuǎn)換流先作為一個(gè)可寫流被寫入到標(biāo)準(zhǔn)輸入中,而此時(shí) stdin 的作用是讀流,即讀取用戶的輸入,讀取后轉(zhuǎn)換流作為一個(gè)可讀流調(diào)用 pipe ,將用戶輸入的信息通過(guò)標(biāo)準(zhǔn)輸出寫到命令行窗口,此時(shí) stdout 的作用是寫流。
感謝各位的閱讀!關(guān)于“NodeJS如何實(shí)現(xiàn)自定義流的方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
文章題目:NodeJS如何實(shí)現(xiàn)自定義流的方法
新聞來(lái)源:http://bm7419.com/article48/ijpeep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、軟件開發(fā)、網(wǎng)頁(yè)設(shè)計(jì)公司、全網(wǎng)營(yíng)銷推廣、、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)