In electron, It is possible to send sync message from IpcRenderer to IpcMain via ipcRenderer.sendSync('synchronous-message', 'ping')
.
Also possible to send async message from IpcMain to IpcRenderer using window.webContents.send('ping', 'whoooooooh!')
but is there any way to send sync message from IpcMain to IpcRenderer?
To send a message back to the renderer you would use: win. webContents. send('asynchronous-message', {'SAVED': 'File Saved'});
IPC channels In Electron, processes communicate by passing messages through developer-defined "channels" with the ipcMain and ipcRenderer modules. These channels are arbitrary (you can name them anything you want) and bidirectional (you can use the same channel name for both modules).
There is no such functionality of ipcMain
*. However, you can achieve almost the same result asynchronously with the following steps:
ipcMain
callback.event.sender.send
A dummy example of sum using this approach looks like the following:
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 (referred from 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))
})
}
* I suppose it's because calling synchronously from main to renderer would block the main nodejs process which does serve renderer processes too after all.
The easiest way to access Main Process Objects in renderer process(sync)
// In renderer process (web page).
const { ipcRenderer } = require('electron');
let exec = eval => ipcRenderer.sendSync('synchronous-message', eval);
exec("win.setSize(500,500)");
console.log(exec("win.getBounds()"));
console.log(exec("app.getVersion()"));
// In the Main process.
ipcMain.on('synchronous-message', (event, arg) => {
event.returnValue = eval(arg);
})
It's the way to send msg from Main process to renderer process.(Official example)
// In renderer process (web page).
ipcRenderer.on('test', (event, arg) => {
console.log(arg) // 123
})
// In the Main process.(after loaded you can send msg to renderer process)
win.webContents.on('did-finish-load', () => {
win.webContents.send('test',123);
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With