自我实现的emitter作用: 统一处理listener的入参
基于原先的fromNodeEventEmitter
,我们只需要加一个map
函数参数即可。
export namespace Event {
// emitter: NodeEventEmitter 相当于参数:ipcMain
// eventName: string 相当于参数:'ipc:hello'
export function fromNodeEventEmitter<T>(emitter: NodeEventEmitter, eventName: string, map: (i: I) => O) => T = id => id): Event<T> {
const fn = (...args: any[]) => result.fire(map(...args));
const onFirstListenerAdd = () => emitter.on(eventName, fn);
const onLastListenerRemove = () => emitter.removeListener(eventName, fn);
const result = new Emitter<T>({ onFirstListenerAdd, onLastListenerRemove });
return result.event;
}
}
使用示例: 功能:
- 将
ipc:hello
的事件参数过滤,只剩下sender
这个参数,作为监听的入口参数。 场景例子:
// 原事件监听参数:event, webcontent
ipcMain.on('ipc:hello', (event, webcontent) => {console.log('sender:', event.sender)})
// 现在监听事件参数:sender
onHello((sender) => console.log('sender:', sender));
demo:
// 主进程
const onHello = Event.fromNodeEventEmitter<Electron.WebContents>(ipcMain, 'ipc:hello', ({sender}) => sender);
// 此时就注册了监听:'ipc:hello'事件的一个回调函数。
const remove = onHello((sender) => console.log('注册了一个关于`ipc:hello`事件的回调:', sender));
这样,但凡用onHello
去监听的事件,他们的入口参数都已经被统一处理。