最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

NodeJS實(shí)現(xiàn)自定義流的方法

 更新時(shí)間:2018年08月01日 10:47:30   作者:PandaShen  
在 NodeJS 中要想實(shí)現(xiàn)自定義流,需要依賴(lài)模塊 stream ,直接引入,不需下載,所有種類(lèi)的流都是繼承這個(gè)模塊內(nèi)部提供的對(duì)應(yīng)不同種類(lèi)的類(lèi)來(lái)實(shí)現(xiàn)的。接下來(lái)通過(guò)本文給大家介紹NodeJS實(shí)現(xiàn)自定義流的方法,一起看看吧

前言

常見(jiàn)的自定義流有四種,Readable(可讀流)、Writable(可寫(xiě)流)、Duplex(雙工流)和 Transform(轉(zhuǎn)換流),常見(jiàn)的自定義流應(yīng)用有 HTTP 請(qǐng)求、響應(yīng), crypto 加密,進(jìn)程 stdin 通信等等。

stream 模塊介紹

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

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

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

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

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

// 創(chuàng)建自定義可讀流的類(lèi)
class MyRead extends Readable {
 constructor() {
 super();
 this.index = 0;
 }

 // 重寫(xiě)自定義的可讀流的 _read 方法
 _read() {
 this.index++;
 this.push(this.index + "");

 if (this.index === 3) {
  this.push(null);
 }
 }
}

我們自己寫(xiě)的 _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è)自定義可寫(xiě)流 Writable

1、創(chuàng)建自定義可寫(xiě)流的類(lèi) MyWrite

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

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

寫(xiě)入內(nèi)容時(shí)默認(rèn)第一次寫(xiě)入直接寫(xiě)入文件,后面的寫(xiě)入都寫(xiě)入緩存區(qū),如果不調(diào)用 callback 只能默認(rèn)第一次寫(xiě)入文件,調(diào)用 callback 會(huì)將緩存區(qū)清空并寫(xiě)入文件。

2、驗(yàn)證自定義可寫(xiě)流

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)建自定義可雙工流的類(lèi) MyDuplex

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

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

雙工流分別具備 Readable 和 Writable 的功能,但是讀和寫(xiě)互不影響,互不關(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ì)不要這樣寫(xiě))。

實(shí)現(xiàn)一個(gè)自定義轉(zhuǎn)化流 Transform

1、創(chuàng)建自定義可轉(zhuǎn)化流的類(lèi) MyTransform

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

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

在自定義轉(zhuǎn)化流的 _transform 方法中,讀取數(shù)據(jù)的 push 方法和 寫(xiě)入數(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);

打開(kāi)命令行窗口執(zhí)行 node demo.js ,然后輸入 abc ,會(huì)在命令窗口輸出 ABC 和 123 ,其實(shí)轉(zhuǎn)換流先作為一個(gè)可寫(xiě)流被寫(xiě)入到標(biāo)準(zhǔn)輸入中,而此時(shí) stdin 的作用是讀流,即讀取用戶(hù)的輸入,讀取后轉(zhuǎn)換流作為一個(gè)可讀流調(diào)用 pipe ,將用戶(hù)輸入的信息通過(guò)標(biāo)準(zhǔn)輸出寫(xiě)到命令行窗口,此時(shí) stdout 的作用是寫(xiě)流。

總結(jié)

以上所述是小編給大家介紹的NodeJS實(shí)現(xiàn)自定義流,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Node.js的特點(diǎn)和應(yīng)用場(chǎng)景介紹

    Node.js的特點(diǎn)和應(yīng)用場(chǎng)景介紹

    這篇文章主要介紹了Node.js的特點(diǎn)和應(yīng)用場(chǎng)景介紹,本文講解了Node.js的異步I/O、 事件循環(huán)與回調(diào)函數(shù)、單線(xiàn)程、 跨平臺(tái)等特性,然后總結(jié)了它的使用場(chǎng)景,需要的朋友可以參考下
    2014-11-11
  • nodejs實(shí)現(xiàn)HTTPS發(fā)起POST請(qǐng)求

    nodejs實(shí)現(xiàn)HTTPS發(fā)起POST請(qǐng)求

    這篇文章主要介紹了nodejs實(shí)現(xiàn)HTTPS發(fā)起POST請(qǐng)求的實(shí)例代碼,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-04-04
  • ajax+node+request爬取網(wǎng)絡(luò)圖片的實(shí)例(宅男福利)

    ajax+node+request爬取網(wǎng)絡(luò)圖片的實(shí)例(宅男福利)

    下面小編就為大家?guī)?lái)一篇ajax+node+request爬取網(wǎng)絡(luò)圖片的實(shí)例(宅男福利)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Node實(shí)戰(zhàn)之不同環(huán)境下配置文件使用教程

    Node實(shí)戰(zhàn)之不同環(huán)境下配置文件使用教程

    這篇文章主要給大家介紹了關(guān)于Node實(shí)戰(zhàn)之不同環(huán)境下配置文件使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • node.js中的fs.createReadStream方法使用說(shuō)明

    node.js中的fs.createReadStream方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.createReadStream方法使用說(shuō)明,本文介紹了fs.createReadStream方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node使用Nodemailer發(fā)送郵件的方法實(shí)現(xiàn)

    Node使用Nodemailer發(fā)送郵件的方法實(shí)現(xiàn)

    這篇文章主要介紹了Node使用Nodemailer發(fā)送郵件的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Node.js  事件循環(huán)詳解及實(shí)例

    Node.js 事件循環(huán)詳解及實(shí)例

    這篇文章主要介紹了 Node.js 事件循環(huán)詳解及實(shí)例的相關(guān)資料,Node.js 有多個(gè)內(nèi)置的事件,我們可以通過(guò)引入 events 模塊,并通過(guò)實(shí)例化 EventEmitter 類(lèi)來(lái)綁定和監(jiān)聽(tīng)事件,需要的朋友可以參考下
    2017-08-08
  • 一文詳解Node.contain?函數(shù)兼容處理

    一文詳解Node.contain?函數(shù)兼容處理

    這篇文章主要為大家介紹了Node.contain?函數(shù)兼容處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Node.JS中的模塊、exports和module講解

    Node.JS中的模塊、exports和module講解

    這篇文章主要介紹了Node.JS中的模塊、exports和module講解,模塊分為兩類(lèi)一類(lèi)是核心模塊一類(lèi)是文件模塊,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 利用python分析access日志的方法

    利用python分析access日志的方法

    最近在自學(xué)python,光看是不行的,還是要多實(shí)操的。這就是一個(gè)寫(xiě)給自己的小小工具。主要功能是,便利日志文件夾下的文件,根據(jù)設(shè)定的關(guān)鍵字查找是否有web攻擊行為。有需要的朋友們下面來(lái)一起看看吧。
    2016-10-10

最新評(píng)論

安福县| 晋城| 溧阳市| 铜陵市| 壶关县| 洪湖市| 高平市| 河曲县| 凭祥市| 道孚县| 定日县| 苏尼特右旗| 安顺市| 昌图县| 蕉岭县| 达孜县| 罗江县| 昌都县| 娱乐| 哈尔滨市| 阳新县| 花垣县| 府谷县| 罗田县| 炉霍县| 长寿区| 红原县| 启东市| 伽师县| 宁乡县| 广昌县| 清苑县| 双峰县| 定襄县| 获嘉县| 咸宁市| 文山县| 交口县| 玛多县| 辽中县| 榆林市|