• Node.js Video Tutorials

Node.js - 事件發射器



Node.js API 基於事件驅動的架構。它包含 events 模組,該模組提供了建立和處理自定義事件的功能。event 模組包含 EventEmitter 類。EventEmitter 物件發出命名事件。此類事件會呼叫監聽器函式。事件發射器在 Node.js 生態系統中起著至關重要的作用。Node 中的許多物件都會發出事件,例如,每次對等體連線到 net.Server 物件或連線關閉時,它都會發出事件。當檔案開啟、關閉、執行讀/寫操作時,fs.readStream 物件會發出事件。所有發出事件的物件都是 events.EventEmitter 的例項。

由於 EvenEmitter 類是在 events 模組中定義的,因此我們必須使用 require 語句將其包含在程式碼中。

var events = require('events');

要發出事件,我們應該宣告一個 EventEmitter 類的物件。

var eventEmitter = new events.EventEmitter();

當 EventEmitter 例項遇到任何錯誤時,它會發出“error”事件。當新增新的監聽器時,會觸發“newListener”事件,當移除監聽器時,會觸發“removeListener”事件。

序號 事件及描述
1

newListener(event, listener)

  • event − 字串:事件名稱

  • listener − 函式:事件處理程式函式

每次新增監聽器時都會發出此事件。當觸發此事件時,監聽器可能尚未新增到該事件的監聽器陣列中。

2

removeListener(event, listener)

  • event − 字串 事件名稱

  • listener − 函式 事件處理程式函式

每次有人移除監聽器時都會發出此事件。當觸發此事件時,監聽器可能尚未從該事件的監聽器陣列中移除。

EventEmitter 類中定義了以下例項方法:

序號 事件及描述
1

addListener(event, listener)

在指定事件的監聽器陣列末尾新增一個監聽器。返回發射器,以便可以連結呼叫。

2

on(event, listener)

在指定事件的監聽器陣列末尾新增一個監聽器。與 addListener 相同。

3

once(event, listener)

為事件新增一個一次性監聽器。此監聽器僅在下一次觸發事件時呼叫,之後將其移除。

4

removeListener(event, listener)

從指定事件的監聽器陣列中移除一個監聽器。如果將任何單個監聽器多次新增到指定事件的監聽器陣列中,則必須多次呼叫 removeListener 以移除每個例項。

5

removeAllListeners([event])

移除所有監聽器,或指定事件的監聽器。最好不要移除在程式碼其他地方新增的監聽器,尤其是在您未建立的發射器(例如套接字或檔案流)上。

6

setMaxListeners(n)

預設情況下,如果為特定事件添加了超過 10 個監聽器,則 EventEmitters 會列印警告。設定為零表示無限制。

7

listeners(event)

返回指定事件的監聽器陣列。

8

emit(event, [arg1], [arg2], [...])

按順序使用提供的引數執行每個監聽器。如果事件有監聽器,則返回 true,否則返回 false。

9

off(event, listener)

removeListener 的別名

示例

讓我們定義如下兩個監聽器函式:

var events = require('events');
var eventEmitter = new events.EventEmitter();

// listener #1
var listner1 = function listner1() {
   console.log('listner1 executed.');
}

// listener #2
var listner2 = function listner2() {
   console.log('listner2 executed.');
}

讓我們將這些監聽器繫結到連線事件。第一個函式 listener1 使用 addListener() 方法註冊,而我們使用 on() 方法繫結 listener2。

// Bind the connection event with the listner1 function
eventEmitter.addListener('connection', listner1);

// Bind the connection event with the listner2 function
eventEmitter.on('connection', listner2);

// Fire the connection event 
eventEmitter.emit('connection');

當使用 emit() 方法觸發連線事件時,控制檯會顯示監聽器中的日誌訊息,如上所示。

listner1 executed.
listner2 executed.

讓我們從連線事件中移除 listener2 回撥,然後再次觸發連線事件。

// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");

// Fire the connection event 
eventEmitter.emit('connection');

控制檯現在顯示以下日誌:

listner1 executed.
listner2 executed.
Listner1 will not listen now.
listner2 executed.

EventEmitter 類還具有 listCount() 方法。它是一個類方法,返回給定事件的監聽器數量。

const events = require('events');

const myEmitter = new events.EventEmitter();
// listener #1
var listner1 = function listner1() {
   console.log('listner1 executed.');
}

// listener #2
var listner2 = function listner2() {
  console.log('listner2 executed.');
}

// Bind the connection event with the listner1 function
myEmitter.addListener('connection', listner1);

// Bind the connection event with the listner2 function
myEmitter.on('connection', listner2);

// Fire the connection event 
myEmitter.emit('connection');
console.log("Number of Listeners:" + myEmitter.listenerCount('connection'));

輸出

listner1 executed.
listner2 executed.
Number of Listeners:2
廣告