Files
digital-pilates/utils/SimpleEventEmitter.ts

109 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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 监听器数组的副本
*/
getListeners(event: string): ((...args: any[]) => void)[] {
return this.listeners[event] ? [...this.listeners[event]] : [];
}
/**
* 获取所有事件名称
* @returns 事件名称数组
*/
eventNames(): string[] {
return Object.keys(this.listeners);
}
}
export default SimpleEventEmitter;