/** * React Native兼容的EventEmitter实现 * * 提供与Node.js EventEmitter相似的API,但专门为React Native环境设计 * 避免了对Node.js内置模块的依赖 */ export class SimpleEventEmitter { private listeners: { [event: string]: ((...args: any[]) => void)[] } = {}; /** * 添加事件监听器 * @param event 事件名称 * @param listener 监听器函数 */ on(event: string, listener: (...args: any[]) => void): void { if (!this.listeners[event]) { this.listeners[event] = []; } this.listeners[event].push(listener); } /** * 移除事件监听器 * @param event 事件名称 * @param listener 要移除的监听器函数 */ off(event: string, listener: (...args: any[]) => void): void { if (!this.listeners[event]) return; const index = this.listeners[event].indexOf(listener); if (index > -1) { this.listeners[event].splice(index, 1); } } /** * 触发事件 * @param event 事件名称 * @param args 传递给监听器的参数 */ emit(event: string, ...args: any[]): void { if (!this.listeners[event]) return; // 复制监听器数组,避免在执行过程中数组被修改 const listeners = [...this.listeners[event]]; listeners.forEach(listener => { try { listener(...args); } catch (error) { console.error(`Error in event listener for event "${event}":`, error); } }); } /** * 添加一次性事件监听器 * @param event 事件名称 * @param listener 监听器函数(只会执行一次) */ once(event: string, listener: (...args: any[]) => void): void { const onceWrapper = (...args: any[]) => { this.off(event, onceWrapper); listener(...args); }; this.on(event, onceWrapper); } /** * 移除指定事件的所有监听器 * @param event 事件名称(可选,如果未提供则移除所有事件的监听器) */ removeAllListeners(event?: string): void { if (event) { delete this.listeners[event]; } else { this.listeners = {}; } } /** * 获取指定事件的监听器数量 * @param event 事件名称 * @returns 监听器数量 */ listenerCount(event: string): number { return this.listeners[event]?.length || 0; } /** * 获取指定事件的所有监听器 * @param event 事件名称 * @returns 监听器数组的副本 */ listeners(event: string): ((...args: any[]) => void)[] { return this.listeners[event] ? [...this.listeners[event]] : []; } /** * 获取所有事件名称 * @returns 事件名称数组 */ eventNames(): string[] { return Object.keys(this.listeners); } } export default SimpleEventEmitter;