跳到主要内容

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