@@ -0,0 +1,102 @@
|
||||
// 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();
|
||||
Reference in New Issue
Block a user