首頁 >web前端 >js教程 >聊聊Node.js中的events事件模組

聊聊Node.js中的events事件模組

青灯夜游
青灯夜游轉載
2021-12-06 18:42:214699瀏覽

本篇文章帶大家了解一下Node.js模組中的events模組,介紹一下什麼是事件驅動、NodeJS的事件架構、Events模組核心API等,希望對大家有幫助!

聊聊Node.js中的events事件模組

引用官方說明: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中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除