在處理 backpressure 時(shí)寫(xiě)入可寫(xiě)流(B行):
if (!writable.write(chunk)) {
await once(writable, 'drain');
}
關(guān)閉可寫(xiě)流,并等待寫(xiě)入完成(C行):
writable.end(); await finished(writable);
pipeline()
pipeline(管道)是一種機(jī)制,可以將一個(gè)流的輸出作為另一流的輸入。它通常用于從一個(gè)流中獲取數(shù)據(jù)并將該流的輸出傳遞到另一個(gè)流。管道操作沒(méi)有限制。換句話說(shuō),管道可用于分多個(gè)步驟處理流數(shù)據(jù)。
在 Node 10.x 中引入了 stream.pipeline()。這是一種模塊方法,用于在流轉(zhuǎn)發(fā)錯(cuò)誤和正確清理之間進(jìn)行管道傳輸,并在管道完成后提供回調(diào)。
這是使用管道的例子:
const { pipeline } = require('stream');
const fs = require('fs');
const zlib = require('zlib');
// 使用 pipeline API 可以輕松將一系列流
// 通過(guò)管道傳輸在一起,并在管道完全完成后得到通知。
// 一個(gè)有效地用 gzip壓縮巨大視頻文件的管道:
pipeline(
fs.createReadStream('The.Matrix.1080p.mkv'),
zlib.createGzip(),
fs.createWriteStream('The.Matrix.1080p.mkv.gz'),
(err) => {
if (err) {
console.error('Pipeline failed', err);
} else {
console.log('Pipeline succeeded');
}
}
);
由于pipe 不安全,應(yīng)使用 pipeline 代替 pipe。
流模塊
Node.js 流模塊 提供了構(gòu)建所有流 API 的基礎(chǔ)。
Stream 模塊是 Node.js 中默認(rèn)提供的原生模塊。 Stream 是 EventEmitter 類的實(shí)例,該類在 Node 中異步處理事件。因此流本質(zhì)上是基于事件的。
要訪問(wèn)流模塊:
const stream = require('stream');
stream 模塊對(duì)于創(chuàng)建新型流實(shí)例非常有用。通常不需要使用 stream 模塊來(lái)消耗流。
流驅(qū)動(dòng)的 Node API
由于它們的優(yōu)點(diǎn),許多 Node.js 核心模塊提供了原生流處理功能,最值得注意的是:
net.Socket 是流所基于的主 API 節(jié)點(diǎn),它是以下大多數(shù) API 的基礎(chǔ)process.stdin 返回連接到 stdin 的流process.stdout 返回連接到 stdout 的流process.stderr 返回連接到 stderr 的流fs.createReadStream() 創(chuàng)建一個(gè)可讀的文件流fs.createWriteStream() 創(chuàng)建可寫(xiě)的文件流net.connect() 啟動(dòng)基于流的連接http.request() 返回 http.ClientRequest 類的實(shí)例,它是可寫(xiě)流zlib.createGzip() 使用gzip(一種壓縮算法)將數(shù)據(jù)壓縮到流中zlib.createGunzip() 解壓縮 gzip 流。zlib.createDeflate() deflate(壓縮算法)將數(shù)據(jù)壓縮到流中zlib.createInflate() 解壓縮一個(gè)deflate流
流 備忘單:
查看更多:Node.js 流速查表
以下是與可寫(xiě)流相關(guān)的一些重要事件:
error –表示在寫(xiě)或配置管道時(shí)發(fā)生了錯(cuò)誤。pipeline – 當(dāng)把可讀流傳遞到可寫(xiě)流中時(shí),該事件由可寫(xiě)流發(fā)出。unpipe – 當(dāng)你在可讀流上調(diào)用 unpipe 并停止將其輸送到目標(biāo)流中時(shí)發(fā)出。結(jié)論
這就是所有關(guān)于流的基礎(chǔ)知識(shí)。流、管道和鏈?zhǔn)?Node.js 的核心和最強(qiáng)大的功能。流確實(shí)可以幫你編寫(xiě)簡(jiǎn)潔而高效的代碼來(lái)執(zhí)行 I/O。
另外,還有一個(gè)值得期待的 Node.js 戰(zhàn)略計(jì)劃,稱為 BOB,旨在改善 Node.js 的內(nèi)部數(shù)據(jù)流以及希望作為未來(lái) Node.js 流數(shù)據(jù)接口的公共 API 的。
英文原文地址:https://nodesource.com/blog/understanding-streams-in-nodejs
作者:Liz Parody
翻譯:瘋狂的技術(shù)宅
相關(guān)推薦:nodejs 教程
更多關(guān)于云服務(wù)器,域名注冊(cè),虛擬主機(jī)的問(wèn)題,請(qǐng)?jiān)L問(wèn)西部數(shù)碼官網(wǎng):m.ps-sw.cn