简写一个订阅发布
type Callbacks = (() => void)[]
export class EventEmiter {
events: Map<string, Callbacks> = new Map()
constructor() {
this.events = new Map()
}
subscript(event: string, callback: () => void) {
if (!this.events.has(event)) {
this.events.set(event, [])
}
this.events.get(event)!.push(callback)
return this;
}
public(event: string, ...args: []) {
console.log(`发布了事件: '${event}'`);
if (this.events.has(event)) {
const callbacks = this.events.get(event)!.slice();
callbacks.forEach(callback => {
try {
callback.apply(this, args);
} catch (error) {
console.error(`执行 '${event}' 事件的回调函数时出错:`, error);
}
});
} else {
console.log(`事件 '${event}' 没有订阅者。`);
}
return this;
}
once(event: string, callback: () => void) {
const onceWrapper = (...args: []) => {
this.unsubscript(event, onceWrapper);
callback.apply(this, args);
};
this.subscript(event, onceWrapper);
console.log(`订阅了事件 (仅一次): '${event}'`);
return this;
}
getLength(event?: string) {
if (event) {
return !this.events.has(event) ? 0 : this.events.get(event)!.length
}
return this.events.size
}
unsubscript(event: string, callback: () => void) {
if (!this.events.has(event)) {
console.log(`事件 '${event}' 不存在或没有订阅者。`);
return this;
}
if (!callback) {
this.events.delete(event);
console.log(`已取消所有 '${event}' 事件的订阅。`);
} else {
const callbacks = this.events.get(event)!
const index = callbacks.indexOf(callback);
if (index > -1) {
callbacks.splice(index, 1);
console.log(`取消订阅了事件: '${event}'`);
if (callbacks.length === 0) {
this.events.delete(event);
}
} else {
console.log(`在事件 '${event}' 中未找到指定的回调函数。`);
}
}
return this;
}
clear() {
this.events.clear()
}
}
const ev = new EventEmiter()
const fn1 = () => console.log('fn1')
const fn2 = () => console.log('fn2')
const fn3 = () => console.log('fn3');
ev.subscript('1', fn1)
ev.once('1', fn2)
ev.subscript('1', fn3)
<button onClick={() => { ev.public('1') }}> public </button>