91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs流基類怎么實現

發布時間:2021-12-17 09:29:35 來源:億速云 閱讀:115 作者:iii 欄目:大數據

這篇文章主要講解了“nodejs流基類怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“nodejs流基類怎么實現”吧!

流是對數據生產,消費的一種抽象,今天先分析一下流基類的實現

const EE = require('events');
const util = require('util');
// 流的基類
function Stream() {
  EE.call(this);
}
// 繼承事件訂閱分發的能力
util.inherits(Stream, EE);
 

流的基類只提供了一個函數就是pipe。用于實現管道化。這個方法代碼比較多,分開說。

 

1 處理數據事件

 function ondata(chunk) {
    // 源流有數據到達,并且目的流可寫
    if (dest.writable) {
      // 目的流過載并且源流實現了pause方法,那就暫停可讀流的讀取操作,等待目的流觸發drain事件
      if (false === dest.write(chunk) && source.pause) {
        source.pause();
      }
    }
 }
  // 監聽data事件,可讀流有數據的時候,會觸發data事件
  source.on('data', ondata);

  function ondrain() {
    // 目的流可寫了,并且可讀流可讀,切換成自動讀取模式
    if (source.readable && source.resume) {
      source.resume();
    }
  }
  // 監聽drain事件,目的流可以消費數據了就會觸發該事件
  dest.on('drain', ondrain);
 

這是管道化時流控實現的地方,主要是利用了write返回值和drain事件。

 

流關閉/結束處理

 // 目的流不是標準輸出或標準錯誤,并且end不等于false
  if (!dest._isStdio && (!options || options.end !== false)) {
    // 源流沒有數據可讀了,執行end回調,告訴目的流,沒有數據可讀了
    source.on('end', onend);
    // 源流關閉了,執行close回調
    source.on('close', onclose);
  }
  // 兩個函數只會執行一次,也只會執行一個
  var didOnEnd = false;
  function onend() {
    if (didOnEnd) return;
    didOnEnd = true;
    // 執行目的流的end函數,說明寫數據完畢
    dest.end();
  }

  function onclose() {
    if (didOnEnd) return;
    didOnEnd = true;
    // 銷毀目的流
    if (typeof dest.destroy === 'function') dest.destroy();
  }
 

這里是處理源流結束和關閉后,通知目的流的邏輯。

 

錯誤處理和事件清除

  // remove all the event listeners that were added.
  function cleanup() {
    source.removeListener('data', ondata);
    dest.removeListener('drain', ondrain);

    source.removeListener('end', onend);
    source.removeListener('close', onclose);

    source.removeListener('error', onerror);
    dest.removeListener('error', onerror);

    source.removeListener('end', cleanup);
    source.removeListener('close', cleanup);

    dest.removeListener('close', cleanup);
  }

  function onerror(er) {
    // 出錯了,清除注冊的事件,包括正在執行的onerror函數
    cleanup();
    // 如果用戶沒有監聽流的error事件,則拋出錯誤,所以我們業務代碼需要監聽error事件
    if (EE.listenerCount(this, 'error') === 0) {
      throw er; // Unhandled stream error in pipe.
    }
  }
  // 監聽流的error事件
  source.on('error', onerror);
  dest.on('error', onerror);
  // 源流關閉或者沒有數據可讀時,清除注冊的事件
  source.on('end', cleanup);
  source.on('close', cleanup);
  // 目的流關閉了也清除他注冊的事件
  dest.on('close', cleanup);
 

這里主要是處理了error事件和流關閉/結束/出錯時清除訂閱的事件。這就是流基類的所有邏輯。

感謝各位的閱讀,以上就是“nodejs流基類怎么實現”的內容了,經過本文的學習后,相信大家對nodejs流基類怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西乡县| 锦州市| 横山县| 寻甸| 林西县| 老河口市| 保康县| 桦川县| 滨州市| 麦盖提县| 名山县| 四子王旗| 旺苍县| 松桃| 马山县| 东宁县| 礼泉县| 敖汉旗| 金寨县| 城固县| 磴口县| 基隆市| 徐水县| 长治县| 肇源县| 康保县| 靖远县| 乌苏市| 民丰县| 威远县| 汝州市| 鸡泽县| 泾川县| 饶河县| 乌兰察布市| 五指山市| 泰来县| 喀什市| 都江堰市| 习水县| 留坝县|