Dans electron , il est possible d'envoyer un message de synchronisation d'IpcRenderer à IpcMain via ipcRenderer.sendSync('synchronous-message', 'ping')
.
Également possible d'envoyer un message async d'IpcMain à IpcRenderer à l'aide de window.webContents.send('ping', 'whoooooooh!')
mais est-il possible d'envoyer un message sync d'IpcMain à IpcRenderer?
Il n'y a pas une telle fonctionnalité de ipcMain
*. Cependant, vous pouvez obtenir presque le même résultat de manière asynchrone avec les étapes suivantes:
ipcMain
.event.sender.send
Un exemple factice de somme utilisant cette approche se présente comme suit:
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 (à partir de 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))
})
}
* Je suppose que c’est parce qu’appeler synchroniquement de principal à rendu rendrait le processus nodejs principal, ce qui servirait aussi les processus de rendu après tout.
J'essayais de faire la même chose, et le plus proche que j'ai eu, était d'envoyer d'abord le message de IPCRenderer, puis de retourner ce que vous voulez de l'événement IPCMain reçu, c'est avec l'extrait de code suivant:
// 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';
});