需要实现以下api
- on(event, listener):为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
- emit(event, [arg1], [arg2]): 按监听器的顺序执行执行每个监听器
- once(event, listener): 和on类似,但只触发一次,随后便解除事件监听
- off(event, listener): 移除指定事件的某个监听回调
- offAll([event]):移除指定事件的所有监听回调
- setMaxListeners(n):用于提高监听器的默认限制的数量。(默认10监听回调个产生警告)
- listeners(event): 返回指定事件的监听器数组。
class EventEmitter {
private readonly listeners: Record<string, any>
private maxListener: number
constructor(maxListener = 10) {
this.listeners = {}
this.maxListener = maxListener
}
/**
* 订阅
* @param event
* @param cb
*/
on(event: string, cb: any) {
if (this.listeners[event]?.length >= this.maxListener) {
throw ('超出最大监听限制')
}
if (Array.isArray(this.listeners[event])) {
this.listeners[event].push(cb)
} else {
this.listeners[event] = [].concat(cb)
}
}
/**
* 订阅一次
* @param event
* @param cb
*/
once(event: string, cb: any) {
}
/**
* 取消订阅
* @param event
* @param cb
*/
off(event: string, cb: any) {
this.listeners[event]=this.listeners[event].filter((n: any) => n !== cb)
}
/**
* 发布
* @param event
* @param arg
*/
emit(event: string, ...arg: any[]) {
this.listeners[event].forEach((cb: any) => {
cb.apply(null, arg)
})
}
}
export {EventEmitter}