1

我们可以为 ipcMain.on 方法和 ipcMain.handle() 注册相同的通道吗?

例如:

ipcMain.handle('test', async(event,args) => {
    let result = await somePromise();
    return result;
});

ipcMain.on('test', async(event,args) => {
    event.returnValue = await somePromise();
});

上面的代码会给出错误No handler register for 'test' 吗?如果 ipcRenderer 按顺序通过调用和 sendSync 调用它?

例如:

ipcRenderer.invoke('test', data).then(result => {
    console.log(result);
    return result;
});

someFunction(data) {
    return ipcRenderer.sendSync('test', data);
}
4

1 回答 1

1

这是您可以轻松测试的内容之一。

查看他们的代码ipcMain.handle他们将频道名称存储在一个_invokeHandlers地图中,该地图似乎与模块的其余部分隔离(意思是来自ipcMain.on)。

实际上,ipcMainextends anEventEmitter是一个 Node 类,它维护自己的内部结构来管理事件(这是定义on和的模块once)。

ipcMain.on("test", ...)因此,ipcMain.handle("test", ...)只要您使用适当的机制触发它们,您应该能够安全地使用它们: send/sendSync对应于on/once并且invoke对应于handle/ handleOnce

于 2020-12-13T21:31:15.340 回答