64 lines
1.2 KiB
JavaScript
64 lines
1.2 KiB
JavaScript
|
|
/**
|
|||
|
|
* 事件发射器基类
|
|||
|
|
* 提供事件订阅和发布机制
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
class EventEmitter {
|
|||
|
|
constructor() {
|
|||
|
|
this.events = {};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 注册事件监听器
|
|||
|
|
* @param {string} event - 事件名称
|
|||
|
|
* @param {Function} listener - 监听器函数
|
|||
|
|
*/
|
|||
|
|
on(event, listener) {
|
|||
|
|
if (!this.events[event]) {
|
|||
|
|
this.events[event] = [];
|
|||
|
|
}
|
|||
|
|
this.events[event].push(listener);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 移除事件监听器
|
|||
|
|
* @param {string} event - 事件名称
|
|||
|
|
* @param {Function} listener - 监听器函数(可选)
|
|||
|
|
*/
|
|||
|
|
off(event, listener) {
|
|||
|
|
if (!this.events[event]) return;
|
|||
|
|
|
|||
|
|
if (listener) {
|
|||
|
|
this.events[event] = this.events[event].filter(l => l !== listener);
|
|||
|
|
} else {
|
|||
|
|
delete this.events[event];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 触发事件
|
|||
|
|
* @param {string} event - 事件名称
|
|||
|
|
* @param {*} data - 事件数据
|
|||
|
|
*/
|
|||
|
|
emit(event, data) {
|
|||
|
|
if (!this.events[event]) return;
|
|||
|
|
|
|||
|
|
this.events[event].forEach(listener => {
|
|||
|
|
try {
|
|||
|
|
listener(data);
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error(`事件监听器执行失败 [${event}]:`, error);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 清空所有事件监听器
|
|||
|
|
*/
|
|||
|
|
removeAllListeners() {
|
|||
|
|
this.events = {};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
module.exports = EventEmitter;
|