Browse Source

feat: add EventBus core module

master
npmrun 3 weeks ago
parent
commit
dd580661eb
  1. 57
      src/core/EventBus.ts

57
src/core/EventBus.ts

@ -0,0 +1,57 @@
type EventCallback = (...args: any[]) => void;
class EventBus {
private events: Map<string, Set<EventCallback>> = new Map();
on(event: string, callback: EventCallback): () => void {
if (!this.events.has(event)) {
this.events.set(event, new Set());
}
this.events.get(event)!.add(callback);
// 返回取消订阅函数
return () => this.off(event, callback);
}
off(event: string, callback: EventCallback): void {
const callbacks = this.events.get(event);
if (callbacks) {
callbacks.delete(callback);
if (callbacks.size === 0) {
this.events.delete(event);
}
}
}
once(event: string, callback: EventCallback): () => void {
const onceCallback: EventCallback = (...args) => {
callback(...args);
this.off(event, onceCallback);
};
return this.on(event, onceCallback);
}
emit(event: string, ...args: any[]): void {
const callbacks = this.events.get(event);
if (callbacks) {
callbacks.forEach(cb => {
try {
cb(...args);
} catch (e) {
console.error(`EventBus: error in event "${event}"`, e);
}
});
}
}
clear(): void {
this.events.clear();
}
getEventCount(): number {
return this.events.size;
}
}
export const eventBus = new EventBus();
export default eventBus;
Loading…
Cancel
Save