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

703

自我实现的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去监听的事件,他们的入口参数都已经被统一处理。

下一章会讲到自我实现的emitter作用: 只接收指定对象发送的该事件的消息