UNPKG

vite-uni-dev-tool

Version:

vite-uni-dev-tool, debug, uni-app, 一处编写,到处调试

95 lines (86 loc) 2.65 kB
type EventHandler<T = any> = (payload: T) => void; export class EventBus { // 使用 Map 存储事件及其对应的回调函数数组 private events: Map<string, EventHandler[]> = new Map(); /** * 订阅事件 * @param eventName 事件名称 * @param handler 事件处理函数 * @returns 返回一个取消订阅的函数 */ on<T = any>(eventName: string, handler: EventHandler<T>): () => void { if (!this.events.has(eventName)) { this.events.set(eventName, []); } const handlers = this.events.get(eventName)!; handlers.push(handler as EventHandler); // 返回取消订阅的函数 return () => { this.off(eventName, handler); }; } /** * 发布事件 * @param eventName 事件名称 * @param payload 事件携带的数据 */ emit<T = any>(eventName: string, payload: T): void { if (this.events.has(eventName)) { const handlers = [...this.events.get(eventName)!]; handlers.forEach((handler) => handler(payload)); } } /** * 取消订阅事件 * @param eventName 事件名称 * @param handler 要取消的事件处理函数 */ off<T = any>(eventName: string, handler: EventHandler<T>): void { if (this.events.has(eventName)) { const handlers = this.events.get(eventName)!; this.events.set( eventName, handlers.filter((h) => h !== handler), ); } } /** * 只订阅一次事件,触发后自动取消订阅 * @param eventName 事件名称 * @param handler 事件处理函数 */ once<T = any>(eventName: string, handler: EventHandler<T>): void { const wrapper = (payload: T) => { handler(payload); this.off(eventName, wrapper); }; this.on(eventName, wrapper); } /** * 清除指定事件的所有订阅者,如果未提供事件名称,则清除所有事件 * @param eventName 可选的事件名称 */ clear(eventName?: string): void { if (eventName) { this.events.delete(eventName); } else { this.events.clear(); } } /** * 获取指定事件的订阅者数量,如果未提供事件名称,则返回所有事件的订阅者总数 * @param eventName 可选的事件名称 * @returns 订阅者数量 */ count(eventName?: string): number { if (eventName) { return this.events.has(eventName) ? this.events.get(eventName)!.length : 0; } return Array.from(this.events.values()).reduce( (sum, handlers) => sum + handlers.length, 0, ); } }