javascript
class EventEmitter {
constructor() {
this.cache = new Map();
}
// 订阅
on = (eventName, fn) => {
this.cache.has(eventName)
? this.cache.get(eventName).add(fn)
: this.cache.set(eventName, new Set([fn]));
};
// 订阅一次
once = (eventName, fn) => {
const newFn = (...args) => {
this.off(eventName, newFn);
fn.apply(this, args);
};
this.on(eventName, newFn);
};
// 取消订阅
off = (eventName, fn) => {
if (!this.cache.has(eventName)) return;
if (!fn) {
this.cache.delete(eventName);
} else {
this.cache.get(eventName).delete(fn);
}
};
// 发布
emit = (eventName, ...args) => {
if (!this.cache.has(eventName)) return false;
this.cache.get(eventName).forEach((fn) => fn(...args));
return true;
};
}
class EventEmitter {
constructor() {
this.cache = new Map();
}
// 订阅
on = (eventName, fn) => {
this.cache.has(eventName)
? this.cache.get(eventName).add(fn)
: this.cache.set(eventName, new Set([fn]));
};
// 订阅一次
once = (eventName, fn) => {
const newFn = (...args) => {
this.off(eventName, newFn);
fn.apply(this, args);
};
this.on(eventName, newFn);
};
// 取消订阅
off = (eventName, fn) => {
if (!this.cache.has(eventName)) return;
if (!fn) {
this.cache.delete(eventName);
} else {
this.cache.get(eventName).delete(fn);
}
};
// 发布
emit = (eventName, ...args) => {
if (!this.cache.has(eventName)) return false;
this.cache.get(eventName).forEach((fn) => fn(...args));
return true;
};
}