103 lines
2.6 KiB
JavaScript
103 lines
2.6 KiB
JavaScript
// src/js/core/EventBus.js
|
|
/**
|
|
* 事件总线
|
|
* 统一管理应用内的事件通信
|
|
*/
|
|
class EventBus {
|
|
constructor() {
|
|
this.events = new Map();
|
|
this.onceEvents = new Map();
|
|
}
|
|
|
|
/**
|
|
* 订阅事件
|
|
* @param {string} event - 事件名称
|
|
* @param {Function} callback - 回调函数
|
|
* @returns {Function} 取消订阅函数
|
|
*/
|
|
on(event, callback) {
|
|
if (!this.events.has(event)) {
|
|
this.events.set(event, []);
|
|
}
|
|
this.events.get(event).push(callback);
|
|
|
|
// 返回取消订阅函数
|
|
return () => {
|
|
this.off(event, callback);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 订阅事件(仅触发一次)
|
|
* @param {string} event - 事件名称
|
|
* @param {Function} callback - 回调函数
|
|
*/
|
|
once(event, callback) {
|
|
if (!this.onceEvents.has(event)) {
|
|
this.onceEvents.set(event, []);
|
|
}
|
|
this.onceEvents.get(event).push(callback);
|
|
}
|
|
|
|
/**
|
|
* 取消订阅事件
|
|
* @param {string} event - 事件名称
|
|
* @param {Function} callback - 回调函数(可选)
|
|
*/
|
|
off(event, callback) {
|
|
if (callback) {
|
|
const callbacks = this.events.get(event);
|
|
if (callbacks) {
|
|
const index = callbacks.indexOf(callback);
|
|
if (index > -1) {
|
|
callbacks.splice(index, 1);
|
|
}
|
|
}
|
|
} else {
|
|
this.events.delete(event);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 触发事件
|
|
* @param {string} event - 事件名称
|
|
* @param {...any} args - 事件参数
|
|
*/
|
|
emit(event, ...args) {
|
|
// 触发普通订阅
|
|
const callbacks = this.events.get(event);
|
|
if (callbacks) {
|
|
callbacks.forEach(callback => {
|
|
try {
|
|
callback(...args);
|
|
} catch (error) {
|
|
console.error(`事件 ${event} 的回调执行失败:`, error);
|
|
}
|
|
});
|
|
}
|
|
|
|
// 触发一次性订阅
|
|
const onceCallbacks = this.onceEvents.get(event);
|
|
if (onceCallbacks) {
|
|
onceCallbacks.forEach(callback => {
|
|
try {
|
|
callback(...args);
|
|
} catch (error) {
|
|
console.error(`事件 ${event} 的一次性回调执行失败:`, error);
|
|
}
|
|
});
|
|
this.onceEvents.delete(event);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 清除所有事件监听
|
|
*/
|
|
clear() {
|
|
this.events.clear();
|
|
this.onceEvents.clear();
|
|
}
|
|
}
|
|
|
|
export default new EventBus();
|