EventEmitter

    0

需要实现以下api

  • on(event, listener):为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
  • emit(event, [arg1], [arg2]): 按监听器的顺序执行执行每个监听器
  • once(event, listener): 和on类似,但只触发一次,随后便解除事件监听
  • off(event, listener): 移除指定事件的某个监听回调
  • offAll([event]):移除指定事件的所有监听回调
  • setMaxListeners(n):用于提高监听器的默认限制的数量。(默认10监听回调个产生警告)
  • listeners(event): 返回指定事件的监听器数组。
ts
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

暂无评论