一、介绍
Node.js 中的许多对象都会分发事件,例如:
net.Server
对象在每次有新连接时触发事件。
fs.readStream
对象在文件被打开时触发事件。
所有这些事件对象都是 events.EventEmitter
的实例。EventEmitter
是 Node.js 中用于创建、注册和触发事件的核心模块,实现了事件驱动编程的基础。
二、引入 events
模块
var events = require('events');
var eventEmitter = new events.EventEmitter();
三、基本用法示例
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();event.on('some_event', function() {console.log('some_event 事件触发');
});setTimeout(function() {event.emit('some_event');
}, 1000);
执行结果:
some_event 事件触发
四、事件绑定多个监听器
var events = require('events');
var emitter = new events.EventEmitter();emitter.on('someEvent', function(arg1, arg2) {console.log('listener1', arg1, arg2);
});emitter.on('someEvent', function(arg1, arg2) {console.log('listener2', arg1, arg2);
});emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
执行结果:
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数
五、EventEmitter
方法
序号 | 方法 | 描述 |
---|---|---|
1 | addListener(event, listener) | 添加监听器到监听器数组的尾部 |
2 | on(event, listener) | 绑定事件 |
3 | once(event, listener) | 绑定一次性监听器 |
4 | removeListener(event, listener) | 移除指定监听器 |
5 | removeAllListeners([event]) | 移除所有监听器 |
6 | setMaxListeners(n) | 设置最大监听器数量 |
7 | listeners(event) | 返回监听器数组 |
8 | emit(event, [arg1], [arg2], [...]) | 触发事件 |
六、once()
注册一次性事件
const EventEmitter = require('events');
const myEmitter = new EventEmitter();myEmitter.once('init', () => {console.log('Initialization event occurred');
});myEmitter.emit('init'); // 打印: Initialization event occurred
myEmitter.emit('init'); // 不会再触发
七、监听 error
事件
myEmitter.on('error', (err) => {console.error('Error event triggered:', err);
});myEmitter.emit('error', new Error('Something went wrong'));
执行结果:
Error event triggered: Error: Something went wrong
八、EventEmitter
事件
序号 | 事件 | 描述 |
---|---|---|
1 | newListener | 添加新监听器时触发 |
2 | removeListener | 删除监听器时触发 |
九、listenerCount()
获取监听器数量
var eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + " 个监听器监听连接事件。");
十、继承 EventEmitter
Node.js 核心模块(如 HTTP、fs)都是 EventEmitter
的子类。
继承示例:
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}const customEmitter = new MyEmitter();
customEmitter.on('customEvent', () => {console.log('Custom event fired');
});customEmitter.emit('customEvent');
执行结果:
Custom event fired
十一、结论
EventEmitter
提供了事件的发布与订阅机制,适用于事件驱动编程。可以使用
on
绑定事件,使用emit
触发事件。
once
绑定一次性事件,removeListener
用于移除事件监听。
EventEmitter
允许继承,以创建自定义事件驱动对象。