2022-11-27 23:23:47 +08:00

43 lines
1.1 KiB
TypeScript

import Singleton from '../Base/Singleton';
import { EventEnum } from '../Enum';
interface IItem {
func: Function;
ctx: unknown;
}
export default class EventManager extends Singleton {
static get Instance() {
return super.GetInstance<EventManager>();
}
private eventMap: Map<EventEnum, Array<IItem>> = new Map();
on(event: EventEnum, func: Function, ctx?: unknown) {
if (this.eventMap.has(event)) {
this.eventMap.get(event).push({ func, ctx });
} else {
this.eventMap.set(event, [{ func, ctx }]);
}
}
off(event: EventEnum, func: Function, ctx?: unknown) {
if (this.eventMap.has(event)) {
const index = this.eventMap.get(event).findIndex(i => func === i.func && i.ctx === ctx);
index > -1 && this.eventMap.get(event).splice(index, 1);
}
}
emit(event: EventEnum, ...params: unknown[]) {
if (this.eventMap.has(event)) {
this.eventMap.get(event).forEach(({ func, ctx }) => {
ctx ? func.apply(ctx, params) : func(...params);
});
}
}
clear() {
this.eventMap.clear();
}
}