舉例講解Node.js中的Writable對象
只要有玩過 nodejs,那就一定接觸過 Writable。http 模塊的請求回調(diào)參數(shù)中的 res 參數(shù)就是一個(gè) Writable 對象。我們經(jīng)常會(huì)往上面 write 一堆東西,最后調(diào)用個(gè) end 方法吧?這些都屬于 Writable 的行為。
我們手動(dòng)創(chuàng)建的 Writable 對象是交給用戶使用的,那么 write 和 end 方法都是用戶調(diào)用的。作為提供方,我們?nèi)绾沃雷约旱?Writable 對象被用戶執(zhí)行了什么操作呢?就猜這個(gè) API 吧,我首先會(huì)猜到某個(gè)事件。然而并不是!同 Readable 一樣,它也得覆寫某個(gè)方法來監(jiān)聽操作。下面是創(chuàng)建一個(gè) Writable 讓用戶往里面寫入內(nèi)容,并監(jiān)聽用戶到底寫了什么的例子(基于 babel-node):
import stream from 'stream';
var w = new stream.Writable;
w._write = (buffer, enc, next) => {
console.log(buffer + '');
next(); // 觸發(fā)「寫入完成」
};
w.on('finish', () => {
console.log('finish');
});
void function callee(i) {
if(i < 10) {
w.write(i + '', 'utf-8', () => {
// 寫入完成
});
} else {
w.end();
}
setTimeout(callee, 10, i + 1);
}(0);
同 Readable 的 _read 一樣,如果上面的 _write 沒有被覆寫將拋出異常:
Error: not implemented at Writable._write (_stream_writable.js:430:6) at doWrite (_stream_writable.js:301:12)
另外,write 被設(shè)計(jì)為一個(gè)異步方法,它又第三個(gè)參數(shù)可以傳入完成的回調(diào)。而所謂完成就是在實(shí)現(xiàn)函數(shù) _write 中,next 參數(shù)被調(diào)用。把 write 設(shè)計(jì)成異步是有原因的,如果它是同步執(zhí)行,那么當(dāng)我們需要在 _write 方法中處理一些異步事務(wù)時(shí)就可能產(chǎn)生順序出錯(cuò)。比如一個(gè)磁盤文件的寫操作就是一個(gè)異步的,如果我們寫文件無視這個(gè)異步,那么假如上一個(gè)寫操作被堵塞還沒完成,當(dāng)前的寫操作可能會(huì)先執(zhí)行。所以我們應(yīng)該在 _write 中合理地調(diào)用 next(必須調(diào)用,否則將陷入等待,無法繼續(xù)寫)。
最后,當(dāng)數(shù)據(jù)寫完成后會(huì)觸發(fā) finish 事件,這就意味著 end 方法被用戶調(diào)用了。如果其間做的是寫文件的操作,此時(shí)就應(yīng)該關(guān)閉文件。
- Nodejs學(xué)習(xí)筆記之Global Objects全局對象
- 用nodejs訪問ActiveX對象,以操作Access數(shù)據(jù)庫為例。
- 淺析Node.js的Stream模塊中的Readable對象
- Node.js實(shí)用代碼段之獲取Buffer對象字節(jié)長度
- Node.js實(shí)現(xiàn)JS文件合并小工具
- 一行命令搞定node.js 版本升級
- 跟我學(xué)Nodejs(一)--- Node.js簡介及安裝開發(fā)環(huán)境
- Node.js(安裝,啟動(dòng),測試)
- Node.js實(shí)戰(zhàn) 建立簡單的Web服務(wù)器
- Node.js中如何合并兩個(gè)復(fù)雜對象詳解
相關(guān)文章
node.js學(xué)習(xí)之?dāng)嘌詀ssert的使用示例
assert 模塊主要用于編寫程序的單元測試時(shí)使用,通過斷言可以提早發(fā)現(xiàn)和排查出錯(cuò)誤。下面這篇文章主要給大家介紹了關(guān)于node.js學(xué)習(xí)之?dāng)嘌詀ssert的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
基于Node.js實(shí)現(xiàn)壓縮和解壓縮的方法
本篇文章主要介紹了基于Node.js實(shí)現(xiàn)壓縮和解壓縮的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
Nodejs Playwright 2Captcha 驗(yàn)證碼識別實(shí)現(xiàn)自動(dòng)登陸功能
日常工作當(dāng)中,為了提高工作效率,我們可能會(huì)寫腳本來自動(dòng)執(zhí)行任務(wù),有些網(wǎng)站因?yàn)樾枰脩舻顷?所以腳本的自動(dòng)登陸功能必不可少,這篇文章主要介紹了Nodejs Playwright 2Captcha 驗(yàn)證碼識別實(shí)現(xiàn)自動(dòng)登陸功能,需要的朋友可以參考下2024-05-05
Node.js操作Firebird數(shù)據(jù)庫教程
這篇文章主要為大家分享了Node.js操作Firebird數(shù)據(jù)庫教程,思路清晰便于大家理解,感興趣的小伙伴們可以參考一下2016-03-03
深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行)
這篇文章主要介紹了深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02
詳解如何優(yōu)雅在webpack項(xiàng)目實(shí)現(xiàn)mock服務(wù)器
這篇文章主要為大家介紹了詳解如何優(yōu)雅在webpack項(xiàng)目實(shí)現(xiàn)mock服務(wù)器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

