Node.js V6.9.4
Node.js核心API的大部份是圍繞1個異步事件驅動架構構建的,因此Events模塊是很多模塊的基礎,很多模塊都是基于Events模塊建立的,
例如:net.Server對象每當對等體連接到它時發出1個事件; fs.ReadStream在打開文件時發失事件; 每當數據可用于讀取時,流發失事件。
所有發失事件的對象都是EventEmitter類的實例。這些對象公然了1個EventEmitter.on()函數,它允許1個或多個函數附加到對象發出的命名空間。
我們可以為1個事件對象注冊多個事件,可以為1個事件注冊多個監聽器
1.Events模塊基本用法
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => { //注冊1個名為'event'的事件
console.log('an event occurred!');
});
//觸發名為'event'的事件
myEmitter.emit('event'); // => 'an event occurred!'
2.同步與異步
* EventEmitter依照事件的注冊順序同步的調用監聽器,如果想切換到異步模式,使用setImmediate()或process.nextTick() *
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
setImmediate(() => {
console.log('this happens asynchronously'); // 該事件會異步觸發
});
});
myEmitter.emit('event', 'a', 'b');
3.Error events
* 當事件隊列中產生毛病或沒有為毛病事件注冊監聽器,則利用會拋出1個’error’事件,并且程序會退出 *
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!')); // 拋出毛病并且程序退出
* 避免拋出毛病時,進程崩潰,可以為進程注冊1個uncaughtException事件,用來處理毛病,避免程序崩潰 *
const myEmitter = new MyEmitter();
process.on('uncaughtException', (err) => {
console.log('whoops! there was an error');
});
//進程不會崩潰
myEmitter.emit('error', new Error('whoops!')); // => 'whoops! there was an error'
* 最好實踐:應當始終為監聽器注冊1個’error’事件 *
const myEmitter = new MyEmitter();
myEmitter.on('error', (err) => {
console.log('whoops! there was an error');
});
myEmitter.emit('error', new Error('whoops!')); // => 'whoops! there was an error'
4.Event經常使用API介紹
* const EventEmitter = require(‘events’) *
* const myEE = new EventEmitter() *
方法 | 作用 |
---|---|
myEE.on(‘eventName’, listener) | 為當前實例對象的某個事件注冊監聽器 |
myEE.emit(eventName[, …args]) | 順序觸發當前實例對象某個事件的所有監聽器 |
myEE.once(eventName, listener) | 設置當前實例對象的某個事件的監聽器只觸發1次 |
myEE.addListener(eventName, listener) | 為當前實例對象的某個事件增加監聽器 |
myEE.eventNames() | 返回當前實例對象的所有的注冊事件(按注冊順序) |
myEE.getMaxListeners() | 返回當前實例對象可以設置的最大監聽器數量 |
myEE.listenerCount(eventName) | 返回當前實例對象的某個事件的監聽器數量 |
myEE.listeners(eventName) | 以數組情勢返回當前實例對象的某個事件的所有監聽器 |
myEE.removeAllListeners([eventName]) | 刪除當前對象的某個事件的所有監聽器 |
myEE.removeListener(eventName, listener) | 刪除當前對象的某個事件的某個監聽器 |
myEE.setMaxListeners(n) | 設置監聽器的最大數量 |
下一篇 一個女程序員眼中的程序員