Node.js中的events事件模塊知識點總結
通過對Node的學習及應用,我們知道NodeJS其采用單線程、事件驅(qū)動、非阻塞I/O等架構設計,非常適用于高并發(fā)、I/O密集型應用。
1. 什么是事件驅(qū)動?
事件驅(qū)動,簡單來說就是通過有效方法來監(jiān)聽事件狀態(tài)的變化,并在發(fā)生變化時做出相應的動作。
舉一個生活應用的場景來理解:當我們?nèi)ワ埖瓿燥堻c餐,當我們下單之后,服務員告訴我們的訂單號(這時候可以理解為注冊了一個事件),我們在坐著等候,這時候我們的耳朵就一直監(jiān)聽著服務員的喊號,當喊到我們的時候,我們可以去前臺取餐。
2. 事件模型
NodeJS的事件架構采用經(jīng)典的--訂閱發(fā)布模式
訂閱發(fā)布模式,也可以稱之為消息機制,定義了一種依賴關系,這種依賴關系可以理解為 1對N(多個或者單個)觀察者們同時監(jiān)聽某一個對象相應的狀態(tài)變換,一旦變化則通知到所有觀察者,從而觸發(fā)觀察者注冊的相應事件,該設計模式解決了主體對象與觀察者之間功能的耦合。
3. events模塊
events模塊是NodeJS非常重要的一個模塊,在node中大部分的模塊的實現(xiàn)都繼承了Events類,如fs,http,net等。它提供了一個對象events.EventEmitter,EventEmitter 的核心是事件發(fā)射與事件監(jiān)聽器。
簡單使用:
import { EventEmitter } from 'events';
class MyEmiter extends EventEmitter{};
const myEmitter = new MyEmiter();
myEmitter.on('hello', () => {
console.log('hello 有人喊你啦');
});
myEmitter.emit('hello');
4. Events模塊核心API
4.1 eventEmitter.on(eventName, callback)
注冊監(jiān)聽事件
參數(shù):
eventName: 事件名稱
callback: 事件觸發(fā)被調(diào)用回調(diào)函數(shù)
4.2 eventEmitter.once(eventName, callback)
可以注冊一個監(jiān)聽器,該監(jiān)聽器最多為特定事件調(diào)用一次。 一旦事件被觸發(fā),則監(jiān)聽器就會被注銷然后被調(diào)用。
參數(shù):
eventName: 事件名稱
callback: 事件觸發(fā)被調(diào)用回調(diào)函數(shù)
4.3 eventEmitter.emit(eventName[, ...args])
觸發(fā)指定的監(jiān)聽事件
參數(shù):
eventName: 事件名稱
args可選參數(shù),按順序傳入回調(diào)函數(shù)的參數(shù);
4.4 eventEmitter.removeListener(eventName, callback)
移除指定事件的監(jiān)聽器,注意:該監(jiān)聽器必須是注冊過的。否則無效。
參數(shù):
eventName: 事件名稱
callback: 回調(diào)函數(shù)
4.5 EventEmitter.removeAllListeners(eventName)
移除所有監(jiān)聽器,一個事件可以有多個監(jiān)聽,需要全部移除時,可以用此方法。
參數(shù):
eventName: 需要全部移除的事件名稱;
需要特別注意的是,如果不傳參數(shù),將會移除所有的監(jiān)聽事件,比較暴力,建議慎用。
4.6 EventEmitter.listeners(eventName)
返回名為 eventName 的事件的監(jiān)聽器綁定回調(diào)函數(shù)數(shù)組的副本。
4.7 EventEmitter.eventNames()
返回列出觸發(fā)器已為其注冊監(jiān)聽器的事件的數(shù)組。
4.8 EventEmitter.setMaxListeners(n)
默認情況下,如果為特定事件添加了 10 個以上的監(jiān)聽器,則 EventEmitter 將打印警告。
emitter.setMaxListeners() 方法允許修改此特定 EventEmitter 實例的限制。 該值可以設置為 Infinity(或 0)以指示無限數(shù)量的監(jiān)聽器。
5. 同步異步的問題
EventEmitter 按照注冊的順序同步地調(diào)用所有監(jiān)聽器。這確保了事件的正確排序,并有助于避免競爭條件和邏輯錯誤。
6.錯誤處理
當 EventEmitter 實例中發(fā)生錯誤時,典型的操作是觸發(fā) 'error' 事件。 這些在 Node.js 中被視為特殊情況。
如果 EventEmitter 沒有為 'error' 事件注冊至少一個監(jiān)聽器,并且觸發(fā) 'error' 事件,則會拋出錯誤,打印堆棧跟蹤,然后退出 Node.js 進程。
作為最佳實踐,應始終為 'error' 事件添加監(jiān)聽器。
import { EventEmitter } from 'events';
class MyEmiter extends EventEmitter{};
const myEmitter = new MyEmiter();
myEmitter.on('hello', () => {
console.log('hello 有人喊你啦');
});
myEmitter.on('error', (e) => {
console.log(e)
})
myEmitter.emit('hello');
myEmitter.emit('error', new Error('an error happen'))
到此這篇關于Node.js中的events事件模塊知識點總結的文章就介紹到這了,更多相關Node.js中的events事件模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nodejs+Socket.io實現(xiàn)通訊實例代碼
本篇文章主要介紹了Nodejs+Socket.io實現(xiàn)通訊實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
nodejs redis 發(fā)布訂閱機制封裝實現(xiàn)方法及實例代碼
這篇文章主要介紹了nodejs redis 發(fā)布訂閱機制封裝的相關資料,這里提供了實現(xiàn)方法,及實例代碼,具有參考價值,需要的朋友可以參考下2016-12-12

