问题
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?
回答1:
There is no such functionality of ipcMain
*. However, you can achieve almost the same result asynchronously with the following steps:
- Place your code which you would run only after the synchronous call in an
ipcMain
callback. - Reply to ipc message in renderer process with the result using
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.
回答2:
I was trying to do the same, and the closest I got, was sending first the message from the IPCRenderer and then return what you want from the IPCMain event received is with this code snippet:
// In renderer process (web page).
const ipcRenderer = require('electron').ipcRenderer;
console.log(ipcRenderer.sendSync('synchronous-message', 'ping')); // prints "pong"
// In the Main process.
ipcMain.on('synchronous-message', function(event, arg) {
console.log(arg); // prints "ping"
event.returnValue = 'pong';
});
回答3:
Yes it is possible to send send sync message from IpcRenderer to IpcMain
let {ipcRenderer} = require('electron');
ipcRenderer.sendSync('sync', 'Im the message from the renderer');
// Listen for sync message from renderer process
ipcMain.on('sync', (event, arg) => {
console.log(arg); // Print Im the message from the renderer
});
I suggest you to visit this post, Of VJEKOSLAV RATKAJEC, he explains very well the communication between de ipcMain to ipcRenderer and viceversa.
Link: http://electron.rocks/different-ways-to-communicate-between-main-and-renderer-process/
来源:https://stackoverflow.com/questions/47597982/send-sync-message-from-ipcmain-to-ipcrenderer-electron