Node.js - 事件发射器


Node 中的许多对象都会发出事件,例如,每次对等点连接到 net.Server 时,net.Server 都会发出一个事件,fs.readStream 在打开文件时会发出一个事件。所有发出事件的对象都是 events.EventEmitter 的实例。

事件发射器类

正如我们在上一节中看到的,EventEmitter 类位于事件模块中。它可以通过以下代码访问 -

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

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

EventEmitter 提供了多个属性,例如onemiton属性用于将函数与事件绑定,emit用于触发事件。

方法

先生。 方法及说明
1

添加监听器(事件,监听器)

在指定事件的侦听器数组末尾添加侦听器。不会检查侦听器是否已添加。传递相同的事件和侦听器组合的多个调用将导致侦听器被多次添加。返回发射器,因此可以链接调用。

2

on(事件,侦听器)

在指定事件的侦听器数组末尾添加侦听器。不会检查侦听器是否已添加。传递相同的事件和侦听器组合的多个调用将导致侦听器被多次添加。返回发射器,因此可以链接调用。

3

一次(事件,侦听器)

向事件添加一次性侦听器。仅在下次触发事件时才调用此侦听器,之后将其删除。返回发射器,因此可以链接调用。

4

移除监听器(事件,监听器)

从指定事件的侦听器数组中删除侦听器。注意 -它更改侦听器后面的侦听器数组中的数组索引。removeListener 最多将从侦听器数组中删除一个侦听器实例。如果任何单个侦听器已多次添加到指定事件的侦听器数组中,则必须多次调用removeListener 才能删除每个实例。返回发射器,因此可以链接调用。

5

移除所有监听器([事件])

删除所有侦听器或指定事件的侦听器。删除在代码中其他位置添加的侦听器并不是一个好主意,特别是当它位于您未创建的发射器上时(例如套接字或文件流)。返回发射器,因此可以链接调用。

6

设置最大监听器(n)

默认情况下,如果为特定事件添加了超过 10 个侦听器,EventEmitters 将打印警告。这是一个有用的默认值,有助于查找内存泄漏。显然,并非所有发射器都应限制为 10 个。此功能允许增加发射器数量。设置为零表示无限制。

7

听众(事件)

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

8

发出(事件,[arg1],[arg2],[...])

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

类方法

先生。 方法及说明
1

监听器计数(发射器,事件)

返回给定事件的侦听器数量。

活动

先生。 活动及描述
1

新监听器

  • event - 字符串:事件名称

  • 监听器- 功能:事件处理函数

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

2

移除监听器

  • event - 字符串 事件名称

  • 监听器- 函数 事件处理函数

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

例子

使用以下 Node.js 代码创建一个名为 main.js 的 js 文件 -

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.');
}

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

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

var eventListeners = require('events').EventEmitter.listenerCount
   (eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

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

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

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

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

console.log("Program Ended.");

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

2 Listner(s) listening to connection event
listner1 executed.
listner2 executed.
Listner1 will not listen now.
listner2 executed.
1 Listner(s) listening to connection event
Program Ended.