IM_手写一个EventBus

70 阅读1分钟

EventBus是一个用于组件间通信的库,它基于发布/订阅模式,允许不同组件或模块之间通过事件来通信,而无需直接引用彼此;

class EventBus {
    events: any;  
    constructor() {  
      this.events = {};  
    }  
    // 订阅事件  
    on(eventName: string, listener: (...args: any[]) => void): void {  
      if (!this.events[eventName]) {  
        this.events[eventName] = [];  
      }  
      this.events[eventName].push(listener);  
    }  
    // 取消订阅事件  
    off(eventName: string, listener: (...args: any[]) => void): void {  
      if (!this.events[eventName]) return;  
      this.events[eventName] = this.events[eventName].filter((cb: () => void) => cb !== listener);  
      // 如果没有任何订阅者,则删除该事件  
      if (this.events[eventName].length === 0) {  
        delete this.events[eventName];  
      }  
    }
    
    // 触发事件  
    emit(eventName: string, ...args: any[]) {  
      if (!this.events[eventName]) return;  
      this.events[eventName].forEach((callback: (...args: any[]) => void): void => {  
        callback(...args);
      });  
    }  
    
    // 获取事件订阅者数量(可选)  
    getEventListenersCount(eventName: string) {  
      return this.events[eventName] ? this.events[eventName].length : 0;  
    }
}  
// 使用示例  
const AzEventBus: any = new EventBus(); 
export default AzEventBus;