将同步消息从IpcMain发送到IpcRenderer – Electron

在电子中 ,可以通过ipcRenderer.sendSync('synchronous-message', 'ping')从IpcRenderer向IpcMain发送同步消息。

也可以使用window.webContents.send('ping', 'whoooooooh!')从IpcMain向IpcRenderer发送asynchronous消息window.webContents.send('ping', 'whoooooooh!')

但有什么办法发送同步信息从IpcMain到IpcRenderer?

ipcMain *没有这样的function。 但是,您可以通过以下步骤asynchronous获得几乎相同的结果:

  • 将您的代码放在ipcMaincallback中,只能在同步调用之后运行。
  • 在渲染器进程中回复ipc消息,并使用event.sender.send结果

总结使用这种方法的一个虚拟示例如下所示:

main.js

 const {app, BrowserWindow, ipcMain} = require('electron') const path = require('path') app.once('ready', () => { let win = new BrowserWindow() // have to run "sync", that is only after result is ready const doJobWithResult = (res) => { console.log(res) } win.webContents.once('dom-ready', () => { win.webContents .send('sum-request', 23, 98, 3, 61) ipcMain.once('sum-reply', (event, sum) => { doJobWithResult(sum) }) }) win.loadURL(path.resolve(__dirname, 'test.html')) }) 

renderer.js(从test.html引用)

 const {ipcRenderer} = require('electron') window.onload = () => { const add = (a, b) => { return a + b } ipcRenderer.on('sum-request', (event, ...args) => { event.sender.send('sum-reply', [...args].reduce(add, 0)) }) } 

*我想这是因为从main到renderer的同步调用会阻止主要的nodejs进程,它也是渲染器进程。