# EventEmitter
# 簡介
events 是 Node.js 最重要的模塊,沒有“之一” ,原因是 Node.js 本身架構就是事件式的,而它提供了唯一的接口,所以堪稱 Node.js 事件編程的基石。 events 模塊不僅用于用戶代碼與 Node.js 下層事件循環的交互,還幾乎被所有的模塊依賴。
例如,net.Server 會在每次有新連接時觸發事件,fs.ReadStream 會在打開文件時觸發事件。
# EventEmitter
events 模塊只提供了一個對象:events.EventEmitter 。 EventEmitter 的核心就是事件觸發與事件監聽器功能的封裝。 EventEmitter 的每個事件由一個事件名和若干個參數組成,事件名是一個字符串,通常表達一定的語義。對于每個事件, EventEmitter 支持若干個事件監聽器。當事件觸發時,注冊到這個事件的事件監聽器被依次調用,事件參數作為回調函數參數傳遞。常用 API 如下:
* on(event, listener) 為指定事件注冊一個監聽器,接受一個字符串 event 和一個回調函數 listener。
* emit(event, \[arg1\], \[arg2\], \[...\]) 觸發 event 事件,傳遞若干可選參數到事件監聽器的參數表。
* once(event, listener) 為指定事件注冊一個單次監聽器,即監聽器最多只會觸發一次,觸發后立刻解除該監聽器。
* removeListener(event, listener) 移除指定事件的某個監聽器,listener 必須是該事件已經注冊過的監聽器。
* removeAllListeners(\[event\]) 移除所有事件的所有監聽器,若指定 event,則移除指定事件的所有監聽器。
~~~
const events = require('events');
let emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) { // 綁定事件處理函數
? ?console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) { ?// 綁定事件處理函數
? ?console.log('listener2', arg1, arg2);
});
emitter.emit('someEvent', 'lony', 1988); ? ? ? ?// 觸發事件
~~~
# error 事件
EventEmitter 定義了一個特殊的事件 error ,它包含了“錯誤”的語義,我們在遇到異常的時候通常會發射 error 事件。當 error 被發射時, EventEmitter 規定如果沒有響應的監聽器,Node.js 會把它當作異常,退出程序并打印調用棧。 我們一般要為會發射 error 事件的對象設置監聽器,避免遇到錯誤后整個程序崩潰。例如:
~~~
const events = require('events');
let emitter = new events.EventEmitter();
emitter.emit('error');
~~~
# 繼承 EventEmitter
大多數時候我們不會直接使用 EventEmitter ,而是在對象中繼承它。包括 fs、net、http 在內的,只要是支持事件響應的核心模塊都是 EventEmitter 的子類。為什么要這樣做呢?原因有兩點。首先,具有某個實體功能的對象實現事件符合語義,事件的監聽和觸發應該是一個對象的方法。其次 JavaScript 的對象機制是基于原型的,支持部分多重繼承,繼承 EventEmitter 不會打亂對象原有的繼承關系。
- NodeJs
- 01-萬維網
- 02-CS 架構 VS BS 架構
- 03-Web 服務器訪問流程
- 04-url
- 05-網絡傳輸協議
- 06-HTTP 協議
- 07-報文
- 08-命令行界面
- 09-什么是 Node.js
- 10-環境安裝及配置
- 11-JavaScript 代碼運行環境
- 12-全局對象
- 13-Buffer
- 14-模塊化
- 15-EventEmitter
- 16-path模塊
- 17-流式操作
- 18-包
- 19-模板技術
- 20-ejs入門
- 21-express
- 01-什么是express
- 02-Hellow Express
- 03-靜態資源服務
- 04-路由
- 05-模塊化路由處理程序
- 06-中間件
- 07-手動實現中間件
- 08-常用內置中間件和第三方中間件
- 09-響應
- 10-獲取請求參數
- 11-Express 中使用模板引擎
- 22-web存儲與安全
- 01-cookie
- 02-sessionStorage
- 03-localStorage
- 04-base64
- 05-https
- 06-同源策略