web-dev-qa-db-fra.com

Envoyer un message de synchronisation d'IpcMain à IpcRenderer - Electron

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?

5
JerryGoyal

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:

  • Placez votre code que vous n'exécuteriez qu'après l'appel synchrone dans un rappel ipcMain.
  • Répondre au message ipc dans le processus de rendu avec le résultat en utilisant 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.

4
pergy

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';
});

0
Juan Sánchez