Node.js - 事件发射器



Node.js API 基于事件驱动的架构。它包括 events 模块,该模块提供创建和处理自定义事件的功能。事件模块包含 EventEmitter 类。EventEmitter 对象发出命名事件。此类事件调用侦听器函数。事件发射器在Node.js生态系统中起着非常重要的作用。节点中的许多对象都会发出事件,例如,网络。每次对等方连接到服务器对象或关闭连接时,服务器对象都会发出一个事件。fs.readStream 对象在打开、关闭文件、执行读/写操作时发出事件。所有发出事件的对象都是事件的实例。EventEmitter。

由于 EvenEmitter 类是在 events 模块中定义的,因此我们必须在代码中包含 require 语句。


 var events = require('events');

要发出事件,我们应该声明一个 EventEmitter 类的对象。


 var eventEmitter = new events.EventEmitter();

当 EventEmitter 实例遇到任何错误时,它会发出“error”事件。添加新侦听器时,将触发“newListener”事件,删除侦听器时,将触发“removeListener”事件。

活动 描述
newListener(event, listener)

event − String: 事件名称

listener − Function: 事件处理函数

每当添加侦听器时,都会发出此事件。触发此事件时,侦听器可能尚未添加到该事件的侦听器数组中。

removeListener(event, listener)

event − String :事件名称

listener − Function: 事件处理函数

每当有人删除侦听器时,都会发出此事件。触发此事件时,侦听器可能尚未从事件的侦听器数组中删除。

以下实例方法在 EventEmitter 类中定义:

活动 描述
addListener(event, listener)

在指定事件的侦听器数组的末尾添加一个侦听器。返回发射器,因此可以链接调用。

on(event, listener)

在指定事件的侦听器数组的末尾添加一个侦听器。与 addListener 相同。

once(event, listener)

向事件添加一次性侦听器。此侦听器仅在下次触发事件时调用,之后将删除该事件

removeListener(event, listener)

从指定事件的侦听器数组中删除侦听器。如果已将任何单个侦听器多次添加到指定事件的侦听器数组中,则必须多次调用 removeListener 以删除每个实例。

removeAllListeners([event])

删除所有侦听器或指定事件的侦听器。删除添加到代码中其他地方的侦听器不是一个好主意,尤其是当它位于您未创建的发射器(例如套接字或文件流)上时。

setMaxListeners(n)

默认情况下,如果为特定事件添加了 10 个以上的侦听器,EventEmitters 将打印警告。设置为零表示无限制。

listeners(event)

返回指定事件的侦听器数组。

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

使用提供的参数按顺序执行每个侦听器。如果事件有侦听器,则返回 true,否则返回 false。

off(event, listener)

removeListener 的别名

让我们定义两个侦听器函数,如下所示 -


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

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

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

让我们将这些侦听器绑定到连接事件。第一个函数 listener1 是使用 addListener() 方法注册的,而我们使用 on() 方法绑定 listener2。


// 将连接事件与 listner1 函数绑定
eventEmitter.addListener('connection', listner1);

// 将连接事件与 listner2 函数绑定
eventEmitter.on('connection', listner2);

// 触发连接事件
eventEmitter.emit('connection');

当使用 emit() 方法触发连接事件时,控制台会在侦听器中显示日志消息,如上所述

listner1 executed.
listner2 executed.

让我们从连接事件中删除 listener2 回调,并再次触发连接事件。


// 移除listner1函数的绑定
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");

// 触发连接事件
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();
// 侦听器 #1
var listner1 = function listner1() {
	 	console.log('listner1 executed.');
}

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

// 将连接事件与listner1函数绑定
myEmitter.addListener('connection', listner1);

// 将连接事件与listner2函数绑定
myEmitter.on('connection', listner2);

// 触发连接事件
myEmitter.emit('connection');
console.log("Number of Listeners:" + myEmitter.listenerCount('connection'));

输出

listner1 executed.
listner2 executed.
Number of Listeners:2