• 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
广告