在JavaScript中,EventEmitter
是一个常用于事件驱动编程的类,它允许对象(或称为“发射器”)发出命名事件,并让其他对象(或称为“监听器”)监听并响应这些事件。Node.js 的 events
模块提供了一个内置的 EventEmitter
类,但你也可以自己实现一个简单的版本。
下面是一个基本的 EventEmitter
实现示例:
class EventEmitter {
constructor() {
this.events = {};
}
// 注册事件监听器
on(eventName, listener) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(listener);
}
// 一次性监听器,触发后立即移除
once(eventName, listener) {
const onceWrapper = (...args) => {
this.off(eventName, onceWrapper);
listener(...args);
};
this.on(eventName, onceWrapper);
}
// 移除事件监听器
off(eventName, listener) {
if (!this.events[eventName]) return;
this.events[eventName] = this.events[eventName].filter(l => l !== listener);
}
// 触发事件
emit(eventName, ...args) {
if (!this.events[eventName]) return;
this.events[eventName].forEach(listener => listener(...args));
}
// 获取事件监听器的数量
listenerCount(eventName) {
return this.events[eventName] ? this.events[eventName].length : 0;
}
}
// 使用示例
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event'); // 输出: an event occurred!
// 使用一次性监听器
myEmitter.once('event', () => {
console.log('this will be logged only once');
});
myEmitter.emit('event'); // 输出: this will be logged only once
myEmitter.emit('event'); // 不会再次输出上面的日志
这个 EventEmitter
类实现了最基本的功能:注册监听器(on
)、一次性监听器(once
)、移除监听器(off
)、触发事件(emit
)以及获取监听器数量(listenerCount
)。
请注意,这个实现是简化的,并没有处理一些边缘情况,比如在移除监听器时如果监听器没有被注册过,或者在触发事件时如果监听器抛出异常等。在实际应用中,你可能需要更健壮的实现,这时可以考虑使用 Node.js 内置的 events
模块中的 EventEmitter
类。