vite-uni-dev-tool
Version:
vite-uni-dev-tool, debug, uni-app, 一处编写,到处调试
95 lines (86 loc) • 2.65 kB
text/typescript
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,
);
}
}