EventEmitter

    11

需要实现以下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}
评论区
共有评论 0
暂无评论