node系列之events(事件)

地址

傳送門

說明

萬物基于事件。這句話雖然有點夸張,但是在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的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容