欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

在一個可能被多次調(diào)用的函數(shù)中,如果需要給流添加事件監(jiān)聽器來執(zhí)行某些操作。那么則需要警惕添加監(jiān)聽器而導(dǎo)致的內(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.,因為我們在每次調(diào)用該函數(shù)時,都為傳入的流添加了一個額外的error事件監(jiān)聽器和end事件監(jiān)聽器。為了避免這種潛在的內(nèi)存泄露,我們要確保每次函數(shù)執(zhí)行完畢后,清除所有此次調(diào)用添加的額外監(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ù)的回調(diào)在處理完畢數(shù)據(jù)后才被調(diào)用

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

'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回調(diào)可能會在數(shù)據(jù)并未被全部處理時就被調(diào)用,因為流的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()
 }
}

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

相關(guān)文章

  • node.js?實現(xiàn)手機號驗證碼登錄功能

    node.js?實現(xiàn)手機號驗證碼登錄功能

    這篇文章主要介紹了node.js?實現(xiàn)手機號驗證碼登錄功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 提高Node.js性能的應(yīng)用技巧分享

    提高Node.js性能的應(yīng)用技巧分享

    Node.js 是單線程非阻塞 I/O, 使其可以支持成千上萬的并發(fā)操作。這和 NGINX 解決 C10K 問題的方式如出一轍。Node.js 以高效的性能和開發(fā)效率著稱。
    2017-08-08
  • 輕松創(chuàng)建nodejs服務(wù)器(6):作出響應(yīng)

    輕松創(chuàng)建nodejs服務(wù)器(6):作出響應(yīng)

    這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(6):作出響應(yīng),我們接著改造服務(wù)器,讓請求處理程序能夠返回一些有意義的信息,需要的朋友可以參考下
    2014-12-12
  • Koa2框架快速入門與基本使用方式

    Koa2框架快速入門與基本使用方式

    這篇文章主要介紹了Koa2框架快速入門與基本使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 使用Node.js實現(xiàn)簡易MVC框架的方法

    使用Node.js實現(xiàn)簡易MVC框架的方法

    下面小編就為大家?guī)硪黄褂肗ode.js實現(xiàn)簡易MVC框架的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • NodeJs 模仿SIP話機注冊的方法

    NodeJs 模仿SIP話機注冊的方法

    這篇文章主要介紹了NodeJs 模仿SIP話機注冊的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • nodejs如何讀取文件二進制 前端響應(yīng)blob或base64顯示圖片

    nodejs如何讀取文件二進制 前端響應(yīng)blob或base64顯示圖片

    這篇文章主要介紹了nodejs如何讀取文件二進制 前端響應(yīng)blob或base64顯示圖片方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Node.js API詳解之 tty功能與用法實例分析

    Node.js API詳解之 tty功能與用法實例分析

    這篇文章主要介紹了Node.js API詳解之 tty功能與用法,結(jié)合實例形式分析了Node.js API中tty的基本功能、用法及終端操作相關(guān)使用技巧,需要的朋友可以參考下
    2020-04-04
  • 基于豆瓣API+Angular開發(fā)的web App

    基于豆瓣API+Angular開發(fā)的web App

    這篇文章主要介紹了基于豆瓣API+Angular開發(fā)的web App的方法和示例代碼,效果非常棒,有需要的小伙伴參考下
    2015-01-01
  • 從零學(xué)習(xí)node.js之搭建http服務(wù)器(二)

    從零學(xué)習(xí)node.js之搭建http服務(wù)器(二)

    NodeJs是什么我想大家已經(jīng)很了解了,作為一個前端工程師,想要不斷提升自己,一般都會接觸到后端服務(wù)器的技術(shù),NodeJs給我們提供了一個學(xué)習(xí)成本相對較低的捷徑可走。下面這篇文章主要介紹了node.js中搭建http服務(wù)器的相關(guān)資料,需要的朋友可以參考下。
    2017-02-02

最新評論