为什么 param 'handler' 应该用发布/订阅模式在 JS 中包装到一个监听器中?

问题描述

我看过某人的带有发布/订阅模式的 EventHub 代码

invocableHandlerMethod.doInvoke

我在 export class EventHub<E extends Emiter> { private cached: { [name in keyof E]: EventListener[] } = {} as any public on<N extends keyof E>(eventName: N,handler: Handler<E[N]>) { if (!handler) { throw new Error('invaild handler') } if (!this.cached[eventName]) { this.cached[eventName] = [] } const listener = new EventListener(eventName as string,handler,this) this.cached[eventName].push(listener) } public emit<N extends keyof E>(eventName: N,data: E[N] = null) { const listeners = this.cached[eventName] if (!eventName) { throw new Error('invaild eventName') } listeners.forEach((listener) => { listener.handler.call(this,data) }) } public off<N extends keyof E>(eventName: N,target?: EventListener): boolean { // find the listener // ... listener.distory() // ... return false } } 中发现参数 public on() 被包装成一个 handler

EventListener

这对包装器来说是必要的吗?

您能否简要解释一下为什么成为 class EventListener { public eventName: string public emitter: EventHub<any> public handler: Handler<any> public distoried: boolean = false constructor(eventName: string,handler: Handler<any>,emitter: EventHub<any>) { this.eventName = eventName this.handler = handler this.emitter = emitter } public unregister() { this.emitter.off(this.eventName,this) this.distory() } public distory(): boolean { if (this.distoried) { return false } this.handler = null this.emitter = null this.distoried = true return true } } 是有利的?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)