一、种类
Node.js 的事件系统主要包括以下几种事件类型和相关的事件:
EventEmitter(自定义事件):这是 Node.js 事件系统的核心,你可以使用它来创建自定义事件和事件监听器。你可以注册自定义事件并为其添加监听器,然后在适当的时候触发这些事件。这个事件类型是最常用的。
HTTP 事件:Node.js 中的 HTTP 模块也支持事件,例如
request
和response
事件。你可以监听这些事件以处理 HTTP 请求和响应。1
2
3
4
5
6
7
8
9
10
11const http = require('http');
const server = http.createServer((req, res) => {
res.end('Hello, World!');
});
server.on('request', (req, res) => {
console.log('收到请求!');
});
server.listen(3000);文件系统事件:Node.js 的文件系统模块(
fs
模块)支持一系列事件,如open
、close
、data
、end
等,用于处理文件操作和读取。1
2
3
4
5
6
7
8
9
10
11const fs = require('fs');
const readStream = fs.createReadStream('file.txt');
readStream.on('data', (chunk) => {
console.log('读取数据块:', chunk);
});
readStream.on('end', () => {
console.log('读取完成!');
});流事件:Node.js 中的流(
stream
)是一种用于处理数据的抽象接口,它们支持多种事件,如data
、end
、error
等。流事件用于处理数据的输入和输出。定时器事件:Node.js 中的
setTimeout
和setInterval
方法用于创建定时器,它们会触发定时器事件,让你可以执行定时任务。1
2
3setTimeout(() => {
console.log('定时任务执行!');
}, 1000);网络事件:Node.js 中的网络模块(例如
net
、dgram
等)支持事件,用于处理网络连接、数据传输和套接字事件。1
2
3
4
5
6
7
8
9const net = require('net');
const server = net.createServer((socket) => {
console.log('客户端已连接!');
});
server.on('close', () => {
console.log('服务器已关闭!');
});
这些是 Node.js 中常见的事件类型,但你也可以创建自定义事件类型,以满足应用程序的需求。Node.js 的事件系统是构建异步和事件驱动应用程序的核心部分,它允许你有效地管理和处理各种异步操作和事件。
二、EventEmitter介绍
EventEmitter
是 Node.js 事件系统的核心,它提供了用于创建、注册和触发事件的方法。以下是 EventEmitter
的一些重要属性和方法:
EventEmitter 类:
EventEmitter
是一个构造函数,用于创建事件对象的实例。通常,你需要先引入events
模块,然后创建一个自定义事件类继承自EventEmitter
。1
const EventEmitter = require('events');
**on(event, listener):或addListener(event, listener)**。用于注册事件监听器。当特定事件(由
event
参数指定)触发时,与之关联的回调函数(listener
)将被执行。1
2
3emitter.on('eventName', (arg1, arg2) => {
// 回调函数逻辑
});**once(event, listener)**:与
on
类似,用于注册事件监听器,但它只会在事件第一次触发时执行回调函数,之后就会被移除。1
2
3emitter.once('eventName', (arg1, arg2) => {
// 只会执行一次
});**emit(event[, arg1][, arg2][, …])**:用于触发特定事件,可选择传递参数给事件监听器。它会执行与事件关联的所有回调函数,并将参数传递给这些回调函数。
1
emitter.emit('eventName', arg1, arg2);
**removeListener(event, listener)**:从事件的监听器数组中移除指定的事件监听器。
1
emitter.removeListener('eventName', listenerFunction);
**removeAllListeners([event])**:从事件的监听器数组中移除所有监听器。如果提供了
event
参数,只会移除指定事件的监听器。1
emitter.removeAllListeners('eventName');
**listenerCount(event)**:返回指定事件的监听器数量。
1
const count = emitter.listenerCount('eventName');
**setMaxListeners(n)**:设置单个事件可以添加的最大监听器数量,默认情况下为 10。如果需要更多监听器,可以使用这个方法来调整最大限制。
1
emitter.setMaxListeners(20);
三、自定义事件
以下是一个简单的示例,演示如何创建和触发自定义事件:
1 | const EventEmitter = require('events'); |
在这个示例中:
- 我们首先引入了
events
模块并创建了一个自定义事件类MyEmitter
,该类继承自EventEmitter
。 - 然后,我们创建了一个
MyEmitter
的实例myEmitter
。 - 使用
.on
方法,我们注册了一个事件监听器,它监听名为 “customEvent” 的自定义事件。当 “customEvent” 事件被触发时,监听器会执行回调函数,并打印传递给回调函数的参数。 - 最后,我们使用
.emit
方法来触发自定义事件 “customEvent”,并传递两个参数(’Hello’ 和 ‘World’)给事件监听器。
当运行这段代码时,会输出如下内容:
1 | 事件触发了,参数1:Hello,参数2:World |