本篇文章帶大家了解一下Node.js模組中的events模組,介紹一下什麼是事件驅動、NodeJS的事件架構、Events模組核心API等,希望對大家有幫助!
引用官方說明:Node.js 的大部分核心API 都是圍繞慣用的非同步事件驅動架構構建的,在該架構中,某些類型的物件(稱為"觸發器")觸發命名事件,使
Function
物件("監聽器")被呼叫。
透過對Node的學習與應用,我們知道NodeJS其採用單執行緒、事件驅動、非阻塞I/O等架構設計,非常適用於高並發、I /O密集型應用。
事件驅動,簡單來說就是透過有效方法來監聽事件狀態的變化,並在發生變化時做出相應的動作。
舉一個生活應用的場景來理解:當我們去飯店吃飯點餐,當我們下單之後,服務員告訴我們的訂單號碼(這時候可以理解為註冊了一個事件),我們在坐著等候,這時候我們的耳朵就一直監聽著服務生的喊號,當喊到我們的時候,我們可以去前台取餐。
NodeJS的事件架構採用經典的--訂閱發布模式
訂閱發布模式,也可以稱之為訊息機制,定義了一種依賴關係,這種依賴關係可以理解為1對N(多個或單一)觀察者同時監聽某一個物件對應的狀態變換,一旦變化則通知到所有觀察者,從而觸發觀察者註冊的相應事件,此設計模式解決了主體物件與觀察者之間功能的耦合。
events模組是NodeJS非常重要的一個模組,在node中大部分的模組的實作都繼承了Events類,如fs,http,net等。它提供了一個物件events.EventEmitter,EventEmitter 的核心是事件發射與事件監聽器。
簡單使用:
import { EventEmitter } from 'events'; class MyEmiter extends EventEmitter{}; const myEmitter = new MyEmiter(); myEmitter.on('hello', () => { console.log('hello 有人喊你啦'); }); myEmitter.emit('hello');
4.1 eventEmitter.on(eventName, callback)
註冊監聽事件
參數:
#4.2 eventEmitter.once(eventName, callback)
#可以註冊一個監聽器,該監聽器最多為特定事件呼叫一次。一旦事件被觸發,則監聽器就會被登出然後被呼叫。
參數:
4.3 eventEmitter.emit(eventName[, ...args])
觸發指定的監聽事件
#參數:
#4.4 eventEmitter.removeListener(eventName, callback)
移除指定事件的監聽器,注意:該監聽器必須是註冊過的。否則無效。
參數:
4.5 EventEmitter.removeAllListeners (eventName)
移除所有監聽器,一個事件可以有多個監聽,需要全部移除時,可以使用此方法。
參數:
需要特別注意的是,如果不傳參數,將會移除所有的監聽事件,比較暴力,建議慎用。
4.6 EventEmitter.listeners(eventName)
#傳回名為 eventName
的事件的監聽器綁定回調函數數組的副本。
4.7 EventEmitter.eventNames()
#傳回列出觸發器已為其註冊監聽器的事件的陣列。
4.8 EventEmitter.setMaxListeners(n)
預設情況下,如果為特定事件增加了 10
個以上的監聽器,則 EventEmitter
將列印警告。
emitter.setMaxListeners() 方法允許修改此特定 EventEmitter
實例的限制。該值可以設定為 Infinity
(或 0
)以指示無限數量的監聽器。
EventEmitter
依照註冊的順序同步
地呼叫所有監聽器。這確保了事件的正確排序,並有助於避免競爭條件和邏輯錯誤。
當 EventEmitter
實例中發生錯誤時,典型的操作是觸發 'error'
事件。這些在 Node.js 中被視為特殊情況。
如果 EventEmitter
没有为 'error'
事件注册至少一个监听器,并且触发 'error'
事件,则会抛出错误,打印堆栈跟踪,然后退出 Node.js 进程。
作为最佳实践,应始终为 'error'
事件添加监听器。
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相关知识,请访问:nodejs 教程!!
以上是聊聊Node.js中的events事件模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!