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

用NODE.JS中的流編寫工具是要注意的事項

 更新時間:2016年03月01日 11:16:27   投稿:hebedich  
Nodejs讀寫流流的傳輸過程默認是以buffer的形式傳輸?shù)?除非你給他設置其他編碼形式, 小伙伴可以參考下。

Node.js中的流十分強大,它對處理潛在的大文件提供了支持,也抽象了一些場景下的數(shù)據(jù)處理和傳遞。正因為它如此好用,所以在實戰(zhàn)中我們常?;谒鼇砭帉懸恍┕ぞ?函數(shù)/庫 ,但往往又由于自己對流的某些特性的疏忽,導致寫出的 函數(shù)/庫 在一些情況會達不到想要的效果,或者埋下一些隱藏的地雷。本文將會提供兩個在編寫基于流的工具時,私以為有些用的兩個tips。

一,警惕EVENTEMITTER內(nèi)存泄露

在一個可能被多次調用的函數(shù)中,如果需要給流添加事件監(jiān)聽器來執(zhí)行某些操作。那么則需要警惕添加監(jiān)聽器而導致的內(nèi)存泄露:

'use strict';
const fs = require('fs');
const co = require('co');

function getSomeDataFromStream (stream) {
 let data = stream.read();
 if (data) return Promise.resolve(data);

 if (!stream.readable) return Promise.resolve(null);

 return new Promise((resolve, reject) => {
  stream.once('readable', () => resolve(stream.read()));
  stream.on('error', reject);
  stream.on('end', resolve);
 })
}

let stream = fs.createReadStream('/Path/to/a/big/file');

co(function *() {
 let chunk;
 while ((chunk = yield getSomeDataFromStream(stream)) !== null) {
  console.log(chunk);
 }
}).catch(console.error);

在上述代碼中,getSomeDataFromStream函數(shù)會在通過監(jiān)聽error事件和end事件,來在流報錯或沒有數(shù)據(jù)時,完成這個Promise。然而在執(zhí)行代碼時,我們很快就會在控制臺中看到報警信息:(node) warning: possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit.,因為我們在每次調用該函數(shù)時,都為傳入的流添加了一個額外的error事件監(jiān)聽器和end事件監(jiān)聽器。為了避免這種潛在的內(nèi)存泄露,我們要確保每次函數(shù)執(zhí)行完畢后,清除所有此次調用添加的額外監(jiān)聽器,保持函數(shù)無污染:

function getSomeDataFromStream (stream) {
 let data = stream.read();
 if (data) return Promise.resolve(data);

 if (!stream.readable) return Promise.resolve(null);

 return new Promise((resolve, reject) => {
  stream.once('readable', onData);
  stream.on('error', onError);
  stream.on('end', done);

  function onData () {
   done();
   resolve(stream.read());
  }

  function onError (err) {
   done();
   reject(err);
  }

  function done () {
   stream.removeListener('readable', onData);
   stream.removeListener('error', onError);
   stream.removeListener('end', done);
  }
 })
}

二,保證工具函數(shù)的回調在處理完畢數(shù)據(jù)后才被調用

工具函數(shù)往往會對外提供一個回調函數(shù)參數(shù),待處理完流中的所有數(shù)據(jù)后,帶著指定值觸發(fā),通常的做法是將回調函數(shù)的調用掛在流的end事件中,但如果處理函數(shù)是耗時的異步操作,回調函數(shù)則可能在所有數(shù)據(jù)處理完畢前被調用:

'use strict';
const fs = require('fs');

let stream = fs.createReadStream('/Path/to/a/big/file');

function processSomeData (stream, callback) {
 stream.on('data', (data) => {
  // 對數(shù)據(jù)進行一些異步耗時操作
  setTimeout(() => console.log(data), 2000);
 });

 stream.on('end', () => {
  // ...
  callback()
 })
}

processSomeData(stream, () => console.log('end'));

以上的代碼callback回調可能會在數(shù)據(jù)并未被全部處理時就被調用,因為流的end事件的觸發(fā)時機僅僅是在流中的數(shù)據(jù)被讀完時。所以我們需要額外地對數(shù)據(jù)是否已處理完進行檢查:

function processSomeData (stream, callback) {
 let count = 0;
 let finished = 0;
 let isEnd = false;

 stream.on('data', (data) => {
  count++;
  // 對數(shù)據(jù)進行一些異步耗時操作
  setTimeout(() => {
   console.log(data);
   finished++;
   check();
  }, 2000);
 });

 stream.on('end', () => {
  isEnd = true;
  // ...
  check();
 })

 function check () {
  if (count === finished && isEnd) callback()
 }
}

這樣一來,回調便會在所有數(shù)據(jù)都處理完畢后觸發(fā)了。

相關文章

  • NodeJS通過魔術封包喚醒局域網(wǎng)計算機實例

    NodeJS通過魔術封包喚醒局域網(wǎng)計算機實例

    這篇文章主要為大家介紹了NodeJS通過魔術封包喚醒局域網(wǎng)計算機代碼實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Node.js?中的服務器相關概念(常見的服務器任務)

    Node.js?中的服務器相關概念(常見的服務器任務)

    Node.js?中,服務器的創(chuàng)建與管理是非常重要的內(nèi)容,Node.js?的非阻塞?I/O?特性使得它特別適合處理高并發(fā)的請求,本文將介紹一些與?Node.js?服務器相關的基本概念,包括?HTTP?服務器、請求和響應、路由、以及如何處理常見的服務器任務,感興趣的朋友一起看看吧
    2025-04-04
  • Node.js前后端交互實現(xiàn)用戶登陸的實踐

    Node.js前后端交互實現(xiàn)用戶登陸的實踐

    本文主要介紹了Node.js前后端交互實現(xiàn)用戶登陸的實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 詳解electron如何攔截網(wǎng)絡請求并處理響應

    詳解electron如何攔截網(wǎng)絡請求并處理響應

    這篇文章主要為大家詳細介紹了electron如何攔截網(wǎng)絡請求并處理響應,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12
  • 詳解node Async/Await 更好的異步編程解決方案

    詳解node Async/Await 更好的異步編程解決方案

    這篇文章主要介紹了詳解Async/Await 更好的異步編程解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 淺談node.js中間件有哪些類型

    淺談node.js中間件有哪些類型

    這篇文章主要介紹了node.js中間件有哪些類型,對中間件感興趣的同學,可以參考下
    2021-04-04
  • 如何從頭實現(xiàn)一個node.js的koa框架

    如何從頭實現(xiàn)一個node.js的koa框架

    這篇文章主要介紹了如何從頭實現(xiàn)一個node.js的koa框架,koa.js是最流行的node.js后端框架之一,有很多網(wǎng)站都使用koa進行開發(fā),同時社區(qū)也涌現(xiàn)出了一大批基于koa封裝的企業(yè)級框架。,需要的朋友可以參考下
    2019-06-06
  • 使用Node.js find-up在父目錄中高效尋找文件與目錄

    使用Node.js find-up在父目錄中高效尋找文件與目錄

    find-up 是一個小巧但功能強大的 Node.js 包,它能幫助我們實現(xiàn)這一需求,本文將深入探究如何使用 find-up 進行有效搜索,并結合豐富的代碼演示幫助大家快速掌握其用法,需要的朋友可以參考下
    2024-05-05
  • Node.js中的Buffer對象及創(chuàng)建方式

    Node.js中的Buffer對象及創(chuàng)建方式

    node.js提供了一個Buffer對象來提供對二進制數(shù)據(jù)的操作,Buffer?類的實例類似于整數(shù)數(shù)組,但?Buffer?的大小是固定的、且在?V8?堆外分配物理內(nèi)存。本文給大家介紹Node.js中的Buffer對象及創(chuàng)建方式,感興趣的朋友一起看看吧
    2022-01-01
  • node.js(expree.js?)模擬手機驗證碼登錄功能

    node.js(expree.js?)模擬手機驗證碼登錄功能

    這篇文章主要介紹了node.js(expree.js?)模擬手機驗證碼功能及登錄功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01

最新評論

龙山县| 铜川市| 吉安县| 百色市| 三台县| 确山县| 沾益县| 乐都县| 无棣县| 宁都县| 楚雄市| 永顺县| 正宁县| 乐陵市| 什邡市| 宝清县| 普宁市| 陵川县| 邵东县| 海晏县| 彩票| 新余市| 额敏县| 绥宁县| 红安县| 民勤县| 城市| 崇文区| 宁蒗| 阜康市| 临泉县| 藁城市| 怀仁县| 乌鲁木齐县| 区。| 丘北县| 庄浪县| 天峨县| 涪陵区| 马鞍山市| 渝北区|