// 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();