聊聊Node.js中的events事件模組
本篇文章帶大家了解一下Node.js模組中的events模組,介紹一下什麼是事件驅動、NodeJS的事件架構、Events模組核心API等,希望對大家有幫助!
引用官方說明:Node.js 的大部分核心API 都是圍繞慣用的非同步事件驅動架構構建的,在該架構中,某些類型的物件(稱為"觸發器")觸發命名事件,使
Function
物件("監聽器")被呼叫。
透過對Node的學習與應用,我們知道NodeJS其採用單執行緒、事件驅動、非阻塞I/O等架構設計,非常適用於高並發、I /O密集型應用。
1. 什麼是事件驅動?
事件驅動,簡單來說就是透過有效方法來監聽事件狀態的變化,並在發生變化時做出相應的動作。
舉一個生活應用的場景來理解:當我們去飯店吃飯點餐,當我們下單之後,服務員告訴我們的訂單號碼(這時候可以理解為註冊了一個事件),我們在坐著等候,這時候我們的耳朵就一直監聽著服務生的喊號,當喊到我們的時候,我們可以去前台取餐。
2. 事件模型
NodeJS的事件架構採用經典的--訂閱發布模式
訂閱發布模式,也可以稱之為訊息機制,定義了一種依賴關係,這種依賴關係可以理解為1對N(多個或單一)觀察者同時監聽某一個物件對應的狀態變換,一旦變化則通知到所有觀察者,從而觸發觀察者註冊的相應事件,此設計模式解決了主體物件與觀察者之間功能的耦合。
3. events模組
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. Events模組核心API
4.1 eventEmitter.on(eventName, callback)
註冊監聽事件
參數:
- eventName: 事件名稱
- callback: 事件觸發被呼叫回調函數
#4.2 eventEmitter.once(eventName, callback)
#可以註冊一個監聽器,該監聽器最多為特定事件呼叫一次。一旦事件被觸發,則監聽器就會被登出然後被呼叫。
參數:
- eventName: 事件名稱
- callback: 事件觸發被呼叫回調函數
4.3 eventEmitter.emit(eventName[, ...args])
觸發指定的監聽事件
#參數:
- eventName:事件名稱
- args可選參數,依序傳入回呼函數的參數;
#4.4 eventEmitter.removeListener(eventName, callback)
移除指定事件的監聽器,注意:該監聽器必須是註冊過的。否則無效。
參數:
- eventName: 事件名稱
- callback: 回呼函數
4.5 EventEmitter.removeAllListeners (eventName)
移除所有監聽器,一個事件可以有多個監聽,需要全部移除時,可以使用此方法。
參數:
- eventName: 需要全部移除的事件名稱;
需要特別注意的是,如果不傳參數,將會移除所有的監聽事件,比較暴力,建議慎用。
4.6 EventEmitter.listeners(eventName)
#傳回名為 eventName
的事件的監聽器綁定回調函數數組的副本。
4.7 EventEmitter.eventNames()
#傳回列出觸發器已為其註冊監聽器的事件的陣列。
4.8 EventEmitter.setMaxListeners(n)
預設情況下,如果為特定事件增加了 10
個以上的監聽器,則 EventEmitter
將列印警告。
emitter.setMaxListeners() 方法允許修改此特定 EventEmitter
實例的限制。該值可以設定為 Infinity
(或 0
)以指示無限數量的監聽器。
5. 同步非同步的問題
EventEmitter
依照註冊的順序同步
地呼叫所有監聽器。這確保了事件的正確排序,並有助於避免競爭條件和邏輯錯誤。
6.錯誤處理
當 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

選擇一個Node的Docker映像看起來像是小事,但是映像的大小和潛在漏洞可能會對你的CI/CD流程和安全造成重大的影響。那我們要如何選擇一個最好Node.js Docker映像呢?

Node 19已正式發布,以下這篇文章就來帶大家詳解了解Node.js 19的 6 大特性,希望對大家有幫助!

如何用pkg打包nodejs可執行檔?以下這篇文章跟大家介紹一下使用pkg將Node專案打包為執行檔的方法,希望對大家有幫助!

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

事件循環是 Node.js 的基本組成部分,透過確保主執行緒不被阻塞來實現非同步編程,了解事件循環對建立高效應用程式至關重要。以下這篇文章就來帶大家深入了解Node中的事件循環 ,希望對大家有幫助!

node無法用npm指令是因為沒有正確配置環境變量,其解決方法是:1、開啟“系統屬性”;2、找到“環境變數”->“系統變數”,然後編輯環境變數;3、找到nodejs所在的資料夾;4、點選「確定」即可。
