node核心模組
redhack發表於2018-02-04
- Events模組簡介
node的特性:單執行緒 非同步 非阻塞I/O 基於事件驅動的執行在伺服器端輕量、高效的指令碼語言;
Events模組是nodejs的核心模組,是node實現事件驅動的基礎,node中幾乎所有的模組(如http, fs等)都繼承該模組;
Events模組實現了事件註冊,通知等功能,是觀察者模式(事件釋出/訂閱模式)的實現;
只要繼承EventEmitter類,就可擁有事件註冊、觸發事件等,所有能觸發事件的物件都是EventEmitter類的例項, 例如:
net.Server 物件會在每次有新連線時觸發事件;
fs.ReadStream 會在檔案被開啟時觸發事件;
流物件 會在資料可讀時觸發事件;
建立一個新類, 使支援 EventEmitter 事件
eg1: 藉助util模組
let EventEmitter = require('events');
let util = require('util');
function WriteStream () {
EventEmitter.call(this); //繼承私有屬性
}
util.inherits(WriteStream, EventEmitter); //原型繼承,繼承公有
/**
- 定義一個WriteStream類,把EventEmitter類的方法新增到新建立的WriteStream 類中,使WriteStream的例項具有EventEmitter的方法。
- 相當於:
- Object.setPrototypeOf(ctor.prototype, superCtor.prototype); //指定的物件的原型
- ctor.prototype.proto = superCtor.prototype;
*/
eg2: 藉助es6 extends方法
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () {
console.log('觸發了一個事件了');
});
myEmitter.emit('event'); //觸發事件
當我們訂閱了'event'事件後,可以在任何地方通過emit('event')來執行事件回撥;
相關api:
- 匯入模組(建立emitter例項)
var EE = require('events'); //events模組只提供了一個EventEmitter類,所以返回的就是EventEmitter
- 註冊繫結事件
EE.addListener(event, listener);
EE.on(event, listener); //相當於增加觀察者,addListener和on這兩個方式作用是一樣的
EE.once(event, listener); //繫結的事件監聽器只會執行一次,然後就會被刪除掉
//新增了任意的監聽函式時會觸發newListener
EE.on('newListener', (type, listener) => {
});
EE.on('removeListener');
- 觸發事件
EE.emit(event);
- 移除事件
EE.removeListener(event, listener);
EE.removeAllListeners([event]); //移除所有
- 其它api
EE.setMaxListeners(n); //設定同一事件的監聽器最大繫結數,預設情況下,超過10個就會警告;設定為0,是無限制;
EE.listenerCount() //檢視事件監聽器數量