成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

NodeAPI學(xué)習(xí)之Stream

laznrbfe / 2134人閱讀

摘要:回調(diào)函數(shù)將接收到一個(gè)對(duì)象。要禁止這一默認(rèn)行為,選項(xiàng)應(yīng)該指定為。一般來說,建議開發(fā)人員避免使用事件和方法,使用或事件代替。事件在寫入數(shù)據(jù)出錯(cuò)或者使用管道出錯(cuò)時(shí)觸發(fā),事件發(fā)生時(shí),回調(diào)函數(shù)僅會(huì)接收到一個(gè)參數(shù)。注意事件發(fā)生時(shí),流并不會(huì)關(guān)閉。

Stream

流可以是可讀的、可寫的、或者是可讀寫的。所有的流都是EventEmitter的實(shí)例。

對(duì)象模式

所有使用Node.js API創(chuàng)建的流對(duì)象都只能操作strings和Buffer(或Unit8Array)。但是一些第三方流的實(shí)現(xiàn),能夠操作其他類型的javascript值(除了null,它在流處理中有特殊意義),這種類型的流被認(rèn)為是工作在‘對(duì)象模式’

緩沖

Writable和Readable流都會(huì)將數(shù)據(jù)存儲(chǔ)到內(nèi)部的緩存(buffer)中

可讀流的實(shí)現(xiàn)調(diào)用stream.push(chunk)時(shí),數(shù)據(jù)被放到緩存中。如果流的消費(fèi)者沒有調(diào)用stream.read()方法,就會(huì)始終存在于內(nèi)部隊(duì)列中,直到被消費(fèi)。緩存的大小取決于傳遞給流構(gòu)造函數(shù)的highWaterMark選項(xiàng)。當(dāng)內(nèi)部可讀緩存的大小達(dá)到highWaterMark指定的閥值時(shí),流會(huì)暫停從底層資源讀取數(shù)據(jù),直到當(dāng)前緩存的數(shù)據(jù)被消費(fèi)。

可寫流通過反復(fù)調(diào)用writable.write(chunk)方法將數(shù)據(jù)放到緩存。當(dāng)內(nèi)部可寫緩存的總大小小于highWaterMark指定的閥值時(shí),調(diào)用writable.write()返回true,一旦達(dá)到或超過highWaterMark,調(diào)用writable.write()返回false,此時(shí)應(yīng)該停止向流中寫入數(shù)據(jù),直到drain事件被觸發(fā)。

可讀的流Readable

例如fs.createReadStream()

可讀流(Readable streams)是對(duì)提供數(shù)據(jù)的源頭(source)的抽象

兩種工作模式:flowing(流動(dòng)模式)和paused(暫停模式)

flowing模式下:可讀流自動(dòng)從系統(tǒng)底層讀取數(shù)據(jù),并通過EventEmitter()接口的事件盡快將數(shù)據(jù)提供給應(yīng)用。

paused模式下:必須顯式調(diào)用stream.read()方法來從流中讀取數(shù)據(jù)片段。

初始工作模式都是paused的Readable流,可以通過三種途徑切換到flowing模式。

監(jiān)聽data事件

調(diào)用stream.resume()方法

調(diào)用stream.pipe()方法將數(shù)據(jù)發(fā)送到Writable

可讀流可以通過兩種方式切換到paused

如果可讀流沒有橋接可寫流成為管道,調(diào)用stream.pause()實(shí)現(xiàn)

如果可讀流橋接了若干可寫流組成了管道,通過取消data事件監(jiān)聽,并調(diào)用stream.unpipe()方法移除所有管道目標(biāo)實(shí)現(xiàn)

close事件:

在流或其底層資源(比如一個(gè)文件)關(guān)閉后觸發(fā)。事件觸發(fā)后,該流將不會(huì)再觸發(fā)任何事件。

data事件:

在流將數(shù)據(jù)傳遞給消費(fèi)者時(shí)觸發(fā)。當(dāng)流轉(zhuǎn)換到flowing模式時(shí)會(huì)觸發(fā)該事件。處理器的參數(shù)是Buffer對(duì)象,如果你調(diào)用了Readable的setEncoding(encoding)方法,處理器的參數(shù)就是String對(duì)象。

end事件:

在流中再?zèng)]有數(shù)據(jù)可供消費(fèi)時(shí)觸發(fā)。

const readable = readableStreamSomehow()
readable.on("data", (chunk) => {
    console.log(`received ${chunk.length} bytes of buffer data.`)
})
readable.on("end", () => {
    console.log("no more data.")
})

error事件:

通常底層系統(tǒng)內(nèi)部出錯(cuò)從而不能產(chǎn)生數(shù)據(jù),或當(dāng)流的實(shí)現(xiàn)試圖傳遞錯(cuò)誤數(shù)據(jù)時(shí)發(fā)生。回調(diào)函數(shù)將接收到一個(gè)Error對(duì)象。

readable事件:

將在流中有數(shù)據(jù)可供讀取時(shí)觸發(fā)。stream.read()返回可用的數(shù)據(jù)。

const readable = readableStreamSomehow()
readable.on("readable", () => {
    // 有一些數(shù)據(jù)可讀
})

在到達(dá)流數(shù)據(jù)尾部時(shí),該事件也會(huì)觸發(fā)。觸發(fā)順序在end事件之前。stream.read()返回null

// foo.txt是一個(gè)空文件
const fs = require("fs")
const rr = fs.createReadStream("foo.txt")
rr.on("readable", () => {
    console.log("readable", rr.read) // null
})
rr.on("end", () => {
    console.log("end") // end
})

readable.pipe(destination[,options])

綁定一個(gè)writable到readable上,形成一個(gè)管道,并將所有數(shù)據(jù)傳給綁定的writable??梢栽趩蝹€(gè)可讀流上綁定多個(gè)可寫流。

const r = fs.createReadStream("file.txt")
const z = zlib.createGzip()
const w = fs.createWriteStream("file.txt.gz")
r.pipe(z).pipe(w)

默認(rèn)情況下,當(dāng)源可讀流觸發(fā)end事件時(shí),目標(biāo)流也會(huì)調(diào)用stream.end()方法從而結(jié)束寫入。要禁止這一默認(rèn)行為,end選項(xiàng)應(yīng)該指定為false。

reader.pipe(writer, {end: false})
reader.on("end", () => {
    writer.end("goodbye)
})

如果可讀流在處理時(shí)發(fā)生錯(cuò)誤,目標(biāo)可寫流不會(huì)自動(dòng)關(guān)閉。 如果發(fā)生錯(cuò)誤,需要手動(dòng)關(guān)閉所有流以避免內(nèi)存泄漏。

一般來說,建議開發(fā)人員避免使用"readable"事件和readable.read()方法,使用readable.pipe()或"data"事件代替。

writable.unpipe([destination])

readable.unpipe()方法將之前通過stream.pipe()方法綁定的流分離

如果 destination 沒有傳入, 則所有綁定的流都會(huì)被分離.

如果傳入 destination, 但它沒有被pipe()綁定過,則該方法不作為.

可寫的流Writable

例如fs.createWriteStream()

Writable streams是destination的一種抽象,這種destination允許數(shù)據(jù)寫入

close事件:

在流或者底層資源(比如一個(gè)文件)關(guān)閉后觸發(fā),事件觸發(fā)后該流將不會(huì)再觸發(fā)任何事件。

drain事件`:

如果調(diào)用stream.write(chunk)方法返回false,流將在適當(dāng)?shù)臅r(shí)機(jī)觸發(fā)drain事件,這時(shí)才可以繼續(xù)向流中寫入數(shù)據(jù)。

error事件`:

在寫入數(shù)據(jù)出錯(cuò)或者使用管道(pipe)出錯(cuò)時(shí)觸發(fā),事件發(fā)生時(shí),回調(diào)函數(shù)僅會(huì)接收到一個(gè)Error參數(shù)。注意:error事件發(fā)生時(shí),流并不會(huì)關(guān)閉。

finish事件

在調(diào)用了stream.end()方法,且緩沖區(qū)數(shù)據(jù)都已經(jīng)傳給底層系統(tǒng)之后,finish事件將被觸發(fā)。

pipe事件

在可讀流上調(diào)用stream.pipe()方法,并在目標(biāo)流向中添加當(dāng)前可寫流時(shí),將會(huì)在可寫流上觸發(fā)pipe事件。

const writer = writeStreamSomehow()
const reader = readStreamSomehow()
writer.on("pipe", (src) => {
    console.log("piping into the writer")
    assert.equal(src, reader)
})
reader.pipe(writer)

writable.end([chunk][,encoding][,callback])

調(diào)用writable.end()方法表明接下來沒有數(shù)據(jù)要被寫入writable,通過傳入可選的chunk和encoding參數(shù),可以在關(guān)閉流之前再寫入一段數(shù)據(jù)。如果傳入了可選的callback函數(shù),將作為finish事件的回掉函數(shù)。

在調(diào)用了stream.end()方法之后,再調(diào)用stream.write()方法會(huì)導(dǎo)致錯(cuò)誤。

// 寫入hello 并用world結(jié)束寫入
const file = fs.createWriteStream("example.txt)
file.write("hello, ")
file.end("wrold!)
// 后面不允許再寫入數(shù)據(jù)

writable.write(chunk[,encoding][,callback])

向流中寫入數(shù)據(jù),并在數(shù)據(jù)處理完成后調(diào)用callback。我們建議,一旦write()返回false,在"drain"事件觸發(fā)前,不能寫入任何數(shù)據(jù)塊。

writable.uncork()

可讀寫的流Duplex

例如net.Socket()

在讀寫過程中可以修改和變換數(shù)據(jù)的Duplex流Transform

例如zlib.createDeflate()

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89605.html

相關(guān)文章

  • NodeAPI學(xué)習(xí)之Buffer

    摘要:與字符編碼通過指定的編碼進(jìn)制,可以在與普通的字符串之間轉(zhuǎn)換。中文中文通常用于實(shí)例數(shù)組的排序。有點(diǎn)像方法合并截?cái)酁榈拈L(zhǎng)度,缺少的部分會(huì)用補(bǔ)充,是一個(gè)返回,是一個(gè)支持的字符編碼返回,創(chuàng)建并返回一個(gè)形式的迭代器,如果與具有完全相同的字節(jié)就返回 Buffer 可以在TCP流或者文件系統(tǒng)操作等場(chǎng)景中處理二進(jìn)制數(shù)據(jù)流。 Buffer實(shí)例類似于整數(shù)數(shù)組,但是Buffer大小固定、且在V8堆外分配物理...

    Integ 評(píng)論0 收藏0
  • node 核心模塊學(xué)習(xí)之 Buffer

    摘要:核心模塊學(xué)習(xí)之何為在引入之前,沒有能讀取和操作二進(jìn)制數(shù)據(jù)流的機(jī)制,作為引入,以便能和網(wǎng)絡(luò)流文件流等進(jìn)行交互。返回值寫入的實(shí)際大小,沒有足夠的空間保存,只會(huì)寫入一部分。返回值實(shí)際存入的字節(jié)數(shù)。參考文章一進(jìn)階核心模塊常用使用總結(jié) node 核心模塊學(xué)習(xí)之Buffer 何為 Buffer 在ES6引入 TypeArray 之前,JS沒有能讀取和操作二進(jìn)制數(shù)據(jù)流的機(jī)制,Buffer 作為 No...

    soasme 評(píng)論0 收藏0
  • 【搶先領(lǐng)】《React 學(xué)習(xí)之道》我們翻譯了一本最簡(jiǎn)單,且最實(shí)用的 React 實(shí)戰(zhàn)教程……

    摘要:學(xué)習(xí)之道簡(jiǎn)體中文版通往實(shí)戰(zhàn)大師之旅掌握最簡(jiǎn)單,且最實(shí)用的教程。前言學(xué)習(xí)之道這本書使用路線圖中的精華部分用于傳授,并將其融入一個(gè)獨(dú)具吸引力的真實(shí)世界的具體代碼實(shí)現(xiàn)。完美展現(xiàn)了的優(yōu)雅。膜拜的學(xué)習(xí)之道是必讀的一本書。 《React 學(xué)習(xí)之道》The Road to learn React (簡(jiǎn)體中文版) 通往 React 實(shí)戰(zhàn)大師之旅:掌握 React 最簡(jiǎn)單,且最實(shí)用的教程。 showIm...

    oneasp 評(píng)論0 收藏0
  • less學(xué)習(xí)之Bootstrap(按鈕篇)

    摘要:學(xué)習(xí)之按鈕篇如我上一篇學(xué)習(xí)之里面,介紹了的目錄結(jié)構(gòu),說明了在這個(gè)文件里面,定義了主題色,也包括了按鈕的主題色。偽連接,按鈕的樣式顯示為連接的樣式。接下來的安排,自己寫的文章自己也會(huì)去實(shí)現(xiàn)它,另外關(guān)于的學(xué)習(xí)也不會(huì)停止。 less學(xué)習(xí)之Bootstrap按鈕篇) 如我上一篇less學(xué)習(xí)之Bootstrap里面,介紹了Bootstrap的目錄結(jié)構(gòu),說明了在variables.less這個(gè)文件...

    sherlock221 評(píng)論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之synchronize(一)

    摘要:線程安全問題在并發(fā)編程學(xué)習(xí)之基礎(chǔ)概念提到,多線程的劣勢(shì)之一,有個(gè)線程安全問題,現(xiàn)在看看下面的例子。那么,該怎么解決呢,很簡(jiǎn)單,在方法前加個(gè)同步鎖。運(yùn)行結(jié)果如下有兩種情況,是因?yàn)榭凑l先搶占鎖,但是輸出的算法結(jié)果是正確的。 線程安全問題 在java并發(fā)編程學(xué)習(xí)之基礎(chǔ)概念提到,多線程的劣勢(shì)之一,有個(gè)線程安全問題,現(xiàn)在看看下面的例子。 public class NotSafeDemo { ...

    Elle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<