自我实现的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));
这样看起来,我们实现了这个功能,但其实还存在问题: 请听下回分解:根据消息发送者过滤监听消息存在问题