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));
}
}