前端(Electron)事件系统设计第五章

438 阅读1分钟

自我实现的emitter作用: 只接收指定对象发送的该事件的消息

按照一般的思想,我们可能会这么写:

  const filter = (sender: any) => sender == 'xxx';
  const handler = (sender: any) => console.log('注册了一个关于`ipc:hello`事件的回调:', sender);
  const remove = onHello((sender: any) => {
      if (filter(sender)) {
          handler(sender);
      }
  });
  // 简写下即:
  const remove = onHello((sender: any) => filter(sender) && handler(sender));

在上述写法中,你每次onHello去注册一个监听,都需要filter一次,非常难受, 我们可以像下面这样。 原理其实还是利用装饰者思想,对onHello再装饰一次。

export interface Event<T> {
	(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;
}
export namespace Event {
	export function filter<T>(event: Event<T>, filter: (e: T) => boolean): Event<T> {
        return (listener, thisArgs = null, disposables?) => 
            event(e => filter(e) && listener.call(thisArgs, e), null, disposables);
    }
}

实际使用demo:

    // 主进程
    const onHello = Event.fromNodeEventEmitter<Electron.WebContents>(ipcMain, 'ipc:hello', ({sender}) => sender);
    const onlyOnHelloForxx = Event.filter(onHello, (sender: any) => sender == 'xx');
    // `onlyOnHelloForxx`注册监听
    // 这样,使用onlyOnHelloForxx去注册监听,就只会接收某个人的消息了。
    onlyOnHelloForxx((sender: any) => console.log('注册了一个关于`ipc:hello`事件的回调:', sender));

这样看起来,我们实现了这个功能,但其实还存在问题: 请听下回分解:根据消息发送者过滤监听消息存在问题