地址
說明
萬物基于事件。這句話雖然有點夸張,但是在nodejs的世界里,還是挺有道理的。很多的模塊,都是繼承于event。比如,http,file等,都有事件的影子。http監聽一個請求事件,文件可以監聽讀取數據。
基本用法
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
監聽事件: on
觸發事件: emit
需要注意的是,監聽事件需要放在觸發事件之前,不然會導致異常,進程可能直接退出。當然,如果不想進程直接簡單粗暴地退出,可以使用下面語句
process.on('uncaughtException', (err) => {
console.log('whoops! there was an error');
});
// 上面這堆東西也是需要盡可能得放在程序前面哦,不然會捕獲不到錯誤事件的
newListener
事件
在任何的事件被添加(注冊)之前,都會觸發這個事件。
比如,在myEmitter.on('news')
之前,就會先觸發了myEmitter.emit('newListener')
。
同理可得removeListener
事件查詢注冊的事件
myEmitter.on( 'foo', () => {})
myEmitter.on( 'bar', () => {})
myEmitter.eventNames();
// [ 'foo', 'bar']
某個事件的個數
myEmitter.listenerCount(eventName)
響應某個事件之前執行
myEmitter.prependListener(eventName,listener)
myEmitter.prependOnceListener(eventName,listener)
移除事件
單個事件:emitter.removeListener(eventName, listener)
全部事件:emitter.removeAllListeners([eventName])
需要注意的是,removeListener
不會影響當前的事件執行。比如,當有3個event
事件,觸發這個event
事件的時候,會將這3個事件放到內部數組里面,不會受外界干擾。假如第一個listener移除了第2個listener,這3個事件依然會執行。到下一次再次出發這個事件的時候,只會執行第1和第3個事件。
小結
感覺這個event
模塊,設計得還是挺不錯的。比如每次調用完一個方法后,都返回當前實例,這樣就可以使用鏈式調用了。
Returns a reference to the EventEmitter, so that calls can be chained.
很多的模塊都是基于此,雖然用得不是很多,但在某種場合下,用得還是挺6的。