Send sync message from IpcMain to IpcRenderer - Electron

跟風遠走 提交于 2019-12-31 21:34:10

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!