該對象由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()方法緩存
緩存容量由highWaterMark標識,避免內存壓力過大,同時讀和寫有各自的緩存區,保證在速度有所差異的狀況下,它們能各自獨立工做。異步
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的其他部分以後再寫~