Node.js學習筆記(三): 事件機制

大部分的nodejs核心api都創建在異步的事件驅動架構之上,因此events是Node.js 最重要的模塊,它提供了惟一的接口。events 模塊不只用於用戶代碼與 Node.js 下層事件循環的交互,還幾乎被全部的模塊依賴。node

EventEmitter

events 模塊只提供了一個對象: events.EventEmitter。EventEmitter的核心就是事件發射與事件聽器功能的封裝。全部發射事件的對象都是EventEmitter類的實例,它暴露一個on函數來綁定一個或着多個函數到該對象上。當事件發射時,註冊到這個事件的事件監聽器被依次調用,事件參數做爲回調函數參數傳遞。api

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

以上例 中, myEmitter 爲事件 event 註冊了一個事件監聽器, 後發射了 event 事件。運行結果中能夠看到這個事件監聽器的回調函數被調用。架構

  • EventEmitter.on(event, listener) 爲指定事件註冊一個監聽器,接受一個字
    符串 event 和一個回調函數listener。
  • EventEmitter.emit(event, [arg1], [arg2], [...]) 發射 event 事件,傳
    遞若干可選參數到事件監聽器的參數表。
  • EventEmitter.once(event, listener) 爲指定事件註冊一個單次監聽器, 監聽
    聽器最多隻會觸發一次,觸發後馬上解除該監聽器。
  • EventEmitter.removeListener(event, listener) 移除指定事件的某個監聽
    器,listener必須是該事件已經註冊過的監聽器。

若是對一個事件添加了超過10個偵聽器,將會獲得一條警告,這 一處設計與Node.js自身單線程運行有關,設計者認爲偵聽器太多,可能致使內 存泄漏,因此存在這樣一個警告.異步

error事件

EventEmitter 定義了一個特殊的事件 error,它包含了「錯誤」的語義,咱們在遇到異常的時候一般會發射 error 事件。當error 被髮射時,EventEmitter 規定若是沒有響應的監聽器,Node.js 會把它看成異常, 退出程序並打印調用棧。咱們通常要爲會發射 error 事件的對象設置監聽器,避免遇到錯誤後整個個程序崩潰。函數

最佳實踐:oop

const myEmitter = new MyEmitter();
myEmitter.on('error', (err) => {
  console.log('whoops! there was an error');
});
myEmitter.emit('error', new Error('whoops!'));
相關文章
相關標籤/搜索