2694.事件发射器
链接:2694.事件发射器
难度:Medium
标签:
简介:设计一个 EventEmitter 类。这个接口与 Node.js 或 DOM 的 Event Target 接口相似,但有一些差异。EventEmitter 应该允许订阅事件和触发事件。
题解 1 - typescript
- 编辑时间:2023-05-23
- 执行用时:68ms
- 内存消耗:44MB
- 编程语言:typescript
- 解法介绍:利用闭包map存储已经订阅的消息。
type Callback = (...args: any[]) => any;
type Subscription = {
    unsubscribe: () => void;
};
class EventEmitter {
    map: Record<string, Set<Callback>> = {}
    subscribe(eventName: string, callback: Callback): Subscription {
        if (!this.map[eventName]) this.map[eventName] = new Set();
        this.map[eventName].add(callback);
        return {
            unsubscribe: () => {
                this.map[eventName].delete(callback);
            },
        };
    }
    emit(eventName: string, args: any[] = []): any {
        return Array.from(this.map[eventName] ?? []).map(fn => fn(...args));
    }
}