如何解决为什么 param 'handler' 应该用发布/订阅模式在 JS 中包装到一个监听器中?
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 举报,一经查实,本站将立刻删除。