问题描述
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 (将#修改为@)