109 lines
2.7 KiB
TypeScript
109 lines
2.7 KiB
TypeScript
/**
|
||
* 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; |