Node.js 的 Events
模块为 Node.js 应用程序提供了事件驱动的架构。核心模块 events
中的 EventEmitter
类是所有可生成事件对象的基类。
1. 引入 Events 模块
要使用事件模块,首先需要在 Node.js 文件中引入它:
const EventEmitter = require('events');
2. EventEmitter
类
EventEmitter
类是 Node.js 事件模块的核心。它用于创建和处理自定义事件。每个 EventEmitter
实例都可以注册多个事件和相应的事件处理函数(监听器)。
2.1 创建一个 EventEmitter 实例
要创建一个新的 EventEmitter
实例,你可以使用 new
关键字:
const myEmitter = new EventEmitter();
3. EventEmitter
的方法
EventEmitter
类提供了多种方法来操作事件和监听器:
-
emitter.on(eventName, listener)
为指定事件注册一个监听器。每次触发事件时都会调用此监听器。
- eventName: 字符串或符号,表示事件的名称。
- listener: 回调函数,当事件触发时被调用。
const myEmitter = new EventEmitter(); myEmitter.on('event', () => { console.log('An event occurred!'); }); myEmitter.emit('event'); // 输出: An event occurred!
-
emitter.once(eventName, listener)
为指定事件注册一个一次性监听器。事件最多触发一次,触发后立即解除绑定。
- eventName: 字符串或符号,表示事件的名称。
- listener: 回调函数,当事件触发时被调用。
const myEmitter = new EventEmitter(); myEmitter.once('event', () => { console.log('This will only run once'); }); myEmitter.emit('event'); // 输出: This will only run once myEmitter.emit('event'); // 不会输出任何内容
-
emitter.emit(eventName[, ...args])
触发指定事件,并传递参数给监听器。
- eventName: 字符串或符号,表示事件的名称。
- ...args: 传递给监听器函数的参数。
const myEmitter = new EventEmitter(); myEmitter.on('eventWithArgs', (a, b) => { console.log(a, b); }); myEmitter.emit('eventWithArgs', 'arg1', 'arg2'); // 输出: arg1 arg2
-
emitter.off(eventName, listener)
(Node.js 10+)移除指定事件的某个监听器,
listener
必须是原来添加时使用的函数。- eventName: 字符串或符号,表示事件的名称。
- listener: 需要移除的监听器函数。
const myEmitter = new EventEmitter(); function log() { console.log('Event happened!'); } myEmitter.on('event', log); myEmitter.off('event', log); // 移除监听器 myEmitter.emit('event'); // 不会输出任何内容
-
emitter.removeListener(eventName, listener)
removeListener()
是off()
方法的别名。const myEmitter = new EventEmitter(); function log() { console.log('Event happened!'); } myEmitter.on('event', log); myEmitter.removeListener('event', log); // 移除监听器 myEmitter.emit('event'); // 不会输出任何内容
-
emitter.removeAllListeners([eventName])
移除指定事件的所有监听器,或者移除所有事件的所有监听器。
- eventName: (可选)字符串或符号,表示事件的名称。
const myEmitter = new EventEmitter(); myEmitter.on('event', () => console.log('Listener 1')); myEmitter.on('event', () => console.log('Listener 2')); myEmitter.removeAllListeners('event'); myEmitter.emit('event'); // 不会输出任何内容
-
emitter.listeners(eventName)
返回指定事件的监听器数组。
- eventName: 字符串或符号,表示事件的名称。
const myEmitter = new EventEmitter(); function listener1() {} function listener2() {} myEmitter.on('event', listener1); myEmitter.on('event', listener2); console.log(myEmitter.listeners('event')); // 输出: [ [Function: listener1], [Function: listener2] ]
-
emitter.listenerCount(eventName)
返回指定事件的监听器数量。
- eventName: 字符串或符号,表示事件的名称。
const myEmitter = new EventEmitter(); myEmitter.on('event', () => {}); myEmitter.on('event', () => {}); console.log(myEmitter.listenerCount('event')); // 输出: 2
-
emitter.setMaxListeners(n)
默认情况下,
EventEmitter
实例最多可以注册 10 个监听器。当超过这个限制时,会输出警告。使用setMaxListeners
可以更改监听器的数量限制。- n: 数字,新监听器的最大数量。
const myEmitter = new EventEmitter(); myEmitter.setMaxListeners(20);
-
emitter.getMaxListeners()
返回当前的监听器最大数量。
const myEmitter = new EventEmitter(); console.log(myEmitter.getMaxListeners()); // 输出: 10 (默认值)
4. EventEmitter
的事件
EventEmitter
实例也会发出一些特定事件:
-
newListener
当添加新的监听器时触发。新监听器在添加之前触发。
- eventName: 字符串或符号,表示事件的名称。
- listener: 回调函数,表示新添加的监听器。
const myEmitter = new EventEmitter(); myEmitter.on('newListener', (event, listener) => { console.log(`Adding listener to ${event} event.`); }); myEmitter.on('event', () => {}); // 输出: Adding listener to event event.
-
removeListener
当移除监听器时触发。监听器在被移除后触发。
- eventName: 字符串或符号,表示事件的名称。
- listener: 回调函数,表示被移除的监听器。
const myEmitter = new EventEmitter(); function listener() { console.log('Listener executed'); } myEmitter.on('removeListener', (event, listener) => { console.log(`Removing listener from ${event} event.`); }); myEmitter.on('event', listener); myEmitter.removeListener('event', listener); // 输出: Removing listener from event event.
5. 捕获错误事件
在 Node.js 中,事件驱动架构通常用于异步操作。处理错误事件对于保证应用程序的健壮性非常重要。如果 EventEmitter
实例发出 error
事件且没有相应的监听器,Node.js 将会抛出一个错误并退出程序。
const myEmitter = new EventEmitter();
// 添加错误事件的监听器
myEmitter.on('error', (err) => {
console.error('An error occurred:', err.message);
});
// 触发错误事件
myEmitter.emit('error', new Error('Something went wrong!'));
6. 继承 EventEmitter
在实际应用中,可以创建自定义类继承 EventEmitter
,从而在类中使用事件功能。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('Event fired!');
});
myEmitter.emit('event'); // 输出: Event fired!
7. 小结
EventEmitter
是 Node.js 事件驱动架构的核心,通过它可以轻松地处理异步事件流。掌握 EventEmitter
的方法和事件,有助于开发更高效、响应更灵敏的 Node.js 应用程序。使用事件驱动编程模式可以帮助你更好地处理异步操作,提高代码的可读性和维护性。
Node.js 的 Events
模块为 Node.js 应用程序提供了事件驱动的架构。核心模块 events
中的 EventEmitter
类是所有可生成事件对象的基类。
1. 引入 Events 模块
要使用事件模块,首先需要在 Node.js 文件中引入它:
const EventEmitter = require('events');
2. EventEmitter
类
EventEmitter
类是 Node.js 事件模块的核心。它用于创建和处理自定义事件。每个 EventEmitter
实例都可以注册多个事件和相应的事件处理函数(监听器)。
2.1 创建一个 EventEmitter 实例
要创建一个新的 EventEmitter
实例,你可以使用 new
关键字:
const myEmitter = new EventEmitter();
3. EventEmitter
的方法
EventEmitter
类提供了多种方法来操作事件和监听器:
-
emitter.on(eventName, listener)
为指定事件注册一个监听器。每次触发事件时都会调用此监听器。
- eventName: 字符串或符号,表示事件的名称。
- listener: 回调函数,当事件触发时被调用。
const myEmitter = new EventEmitter(); myEmitter.on('event', () => { console.log('An event occurred!'); }); myEmitter.emit('event'); // 输出: An event occurred!
-
emitter.once(eventName, listener)
为指定事件注册一个一次性监听器。事件最多触发一次,触发后立即解除绑定。
- eventName: 字符串或符号,表示事件的名称。
- listener: 回调函数,当事件触发时被调用。
const myEmitter = new EventEmitter(); myEmitter.once('event', () => { console.log('This will only run once'); }); myEmitter.emit('event'); // 输出: This will only run once myEmitter.emit('event'); // 不会输出任何内容
-
emitter.emit(eventName[, ...args])
触发指定事件,并传递参数给监听器。
- eventName: 字符串或符号,表示事件的名称。
- ...args: 传递给监听器函数的参数。
const myEmitter = new EventEmitter(); myEmitter.on('eventWithArgs', (a, b) => { console.log(a, b); }); myEmitter.emit('eventWithArgs', 'arg1', 'arg2'); // 输出: arg1 arg2
-
emitter.off(eventName, listener)
(Node.js 10+)移除指定事件的某个监听器,
listener
必须是原来添加时使用的函数。- eventName: 字符串或符号,表示事件的名称。
- listener: 需要移除的监听器函数。
const myEmitter = new EventEmitter(); function log() { console.log('Event happened!'); } myEmitter.on('event', log); myEmitter.off('event', log); // 移除监听器 myEmitter.emit('event'); // 不会输出任何内容
-
emitter.removeListener(eventName, listener)
removeListener()
是off()
方法的别名。const myEmitter = new EventEmitter(); function log() { console.log('Event happened!'); } myEmitter.on('event', log); myEmitter.removeListener('event', log); // 移除监听器 myEmitter.emit('event'); // 不会输出任何内容
-
emitter.removeAllListeners([eventName])
移除指定事件的所有监听器,或者移除所有事件的所有监听器。
- eventName: (可选)字符串或符号,表示事件的名称。
const myEmitter = new EventEmitter(); myEmitter.on('event', () => console.log('Listener 1')); myEmitter.on('event', () => console.log('Listener 2')); myEmitter.removeAllListeners('event'); myEmitter.emit('event'); // 不会输出任何内容
-
emitter.listeners(eventName)
返回指定事件的监听器数组。
- eventName: 字符串或符号,表示事件的名称。
const myEmitter = new EventEmitter(); function listener1() {} function listener2() {} myEmitter.on('event', listener1); myEmitter.on('event', listener2); console.log(myEmitter.listeners('event')); // 输出: [ [Function: listener1], [Function: listener2] ]
-
emitter.listenerCount(eventName)
返回指定事件的监听器数量。
- eventName: 字符串或符号,表示事件的名称。
const myEmitter = new EventEmitter(); myEmitter.on('event', () => {}); myEmitter.on('event', () => {}); console.log(myEmitter.listenerCount('event')); // 输出: 2
-
emitter.setMaxListeners(n)
默认情况下,
EventEmitter
实例最多可以注册 10 个监听器。当超过这个限制时,会输出警告。使用setMaxListeners
可以更改监听器的数量限制。- n: 数字,新监听器的最大数量。
const myEmitter = new EventEmitter(); myEmitter.setMaxListeners(20);
-
emitter.getMaxListeners()
返回当前的监听器最大数量。
const myEmitter = new EventEmitter(); console.log(myEmitter.getMaxListeners()); // 输出: 10 (默认值)
4. EventEmitter
的事件
EventEmitter
实例也会发出一些特定事件:
-
newListener
当添加新的监听器时触发。新监听器在添加之前触发。
- eventName: 字符串或符号,表示事件的名称。
- listener: 回调函数,表示新添加的监听器。
const myEmitter = new EventEmitter(); myEmitter.on('newListener', (event, listener) => { console.log(`Adding listener to ${event} event.`); }); myEmitter.on('event', () => {}); // 输出: Adding listener to event event.
-
removeListener
当移除监听器时触发。监听器在被移除后触发。
- eventName: 字符串或符号,表示事件的名称。
- listener: 回调函数,表示被移除的监听器。
const myEmitter = new EventEmitter(); function listener() { console.log('Listener executed'); } myEmitter.on('removeListener', (event, listener) => { console.log(`Removing listener from ${event} event.`); }); myEmitter.on('event', listener); myEmitter.removeListener('event', listener); // 输出: Removing listener from event event.
5. 捕获错误事件
在 Node.js 中,事件驱动架构通常用于异步操作。处理错误事件对于保证应用程序的健壮性非常重要。如果 EventEmitter
实例发出 error
事件且没有相应的监听器,Node.js 将会抛出一个错误并退出程序。
const myEmitter = new EventEmitter();
// 添加错误事件的监听器
myEmitter.on('error', (err) => {
console.error('An error occurred:', err.message);
});
// 触发错误事件
myEmitter.emit('error', new Error('Something went wrong!'));
6. 继承 EventEmitter
在实际应用中,可以创建自定义类继承 EventEmitter
,从而在类中使用事件功能。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('Event fired!');
});
myEmitter.emit('event'); // 输出: Event fired!
7. 小结
EventEmitter
是 Node.js 事件驱动架构的核心,通过它可以轻松地处理异步事件流。掌握 EventEmitter
的方法和事件,有助于开发更高效、响应更灵敏的 Node.js 应用程序。使用事件驱动编程模式可以帮助你更好地处理异步操作,提高代码的可读性和维护性。