将同步消息从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获得几乎相同的结果:
- 将您的代码放在
ipcMain
callback中,只能在同步调用之后运行。 - 在渲染器进程中回复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进程,它也是渲染器进程。