Open MarsPen opened 2 years ago
class EventEmitter {
constructor() {
this.subs = {};
}
subscribe(eventName, callback) {
this.subs[eventName] ??= new Map();
const key = Symbol();
this.subs[eventName].set(key, callback);
return {
release: () => {
this.subs[eventName].delete(key);
}
}
}
emit(eventName, ...args) {
for(const callback of this.subs[eventName].values()) {
try {
callback(...args);
} catch (e) {
console.log(e)
}
}
}
}
class EventEmitter {
constructor () {
this.subscriptions = new Map()
}
subscribe(eventName, callback) {
if (!this.subscriptions.has(eventName)) {
this.subscriptions.set(eventName, new Set())
}
const subscriptions = this.subscriptions.get(eventName)
const callbackObj = {callback}
subscriptions.add(callbackObj)
return {
release:()=>{
subscriptions.delete(callbackObj)
if (subscriptions.size === 0) {
delete this.subscriptions.eventName
}
}
}
}
emit(eventName, ...args){
const subscriptions = this.subscriptions.get(eventName)
if (subscriptions) {
subscriptions.forEach((cbObj)=>{
cbObj.callback.apply(this, args)
})
}
}
}
题目描述
请实现你自己的 Event Emitter
它需要支持事件订阅
同一个callback可以重复订阅同一个事件