node.js api文檔小記

1、EventEmitter

構造與添加監聽器

該對象由node的event模塊提供,擴展它能夠得到一個EventEmitter類,實例化後便可添加監聽器html

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

觸發事件在最後一行,使用emit方法便可。node

在事件處理器中(如果常規事件被調用),this默認指向事件綁定的EventEmitter,但若是使用了箭頭函數,由於它遵循詞法做用域,this將會指向一個空對象。api

異步與同步

EventEmitter在默認狀況下會同步執行全部的監聽器,若想採用異步模式,使用setImmediate()或process.nextTick()方法緩存

其餘支持的功能

  • 監聽器能夠被調用屢次,也能夠只被調用一次,例如once()接口
  • EventEmitter綁定和銷燬監聽器時會對應地觸發newListener和removeListener事件
  • 此外還有對監聽器數量、名稱、上限等做操做的各類接口,詳情參見node.js官方文檔

2、Stream

分類

  • Stream包括Readable Stream, Writable Stream, Duplex Stream和Transform Stream,前兩種顧名思義,第三種指代既可讀又可寫的流,第四種則是能夠修改或轉換的Duplex Stream
  • 對象模式:流在默認狀況下以Buffer, String或Uint8Array形式傳輸,但能夠經過objectMode參數修改成對象模式,對象模式接受除null之外的其餘數據類型

緩存及其意義

緩存容量由highWaterMark標識,避免內存壓力過大,同時讀和寫有各自的緩存區,保證在速度有所差異的狀況下,它們能各自獨立工做。異步

可寫流

  • HTTP requests, on the client
  • HTTP responses, on the server
  • fs write streams
  • zlib streams
  • crypto streams
  • TCP sockets
  • child process stdin
  • process.stdout, process.stderr

Writable類實現了多個控制讀操做的方法,舉drain方法爲例,它在從新容許將數據寫入流時觸發(Writable.write()返回值即將由false變爲true):socket

function writeOneMillionTimes(writer, data, encoding, callback) {
  let i = 1000000;
  write();
  function write() {
    let ok = true;
    do {
      i--;
      if (i === 0) {
        // last time!
        writer.write(data, encoding, callback);
      } else {
        // see if we should continue, or wait
        // don't pass the callback, because we're not done yet.
        ok = writer.write(data, encoding);
      }
    } while (i > 0 && ok);
    if (i > 0) {
      // had to stop early!
      // write some more once it drains
      writer.once('drain', write);
    }
  }
}

這段官方demo大約是作了這麼一件事:將data寫出一百萬次,如果正常結束就執行callback回調,如果被迫停止(back pressure),則觸發drain事件~函數

此外還有cork將寫入的數據由緩存所有存入內存,直到調用Writable.uncork()時被從新激活ui

可讀流

其包含的流類型與可寫流相似,須要討論的是它的兩種模式,三個狀態~this

兩種模式:包含flowing和paused,flow模式下,經過EventEmitter發佈的data事件,數據將自動進行讀寫,速度快;paused模式下,須要顯式地調用stream.read()方法來指定讀取的數據塊。code

三個狀態:指的是readable._readableState.flowing的狀態,初始爲null,沒有消費者,所以數據也不會生成,但當模式變爲flowing後它的值也會切換爲true,啓動生成數據-發佈data事件的流程。

node.js的其他部分以後再寫~

相關文章
相關標籤/搜索