从IpcMain向IpcRenderer发送同步消息- Electron

v1l68za4  于 11个月前  发布在  Electron
关注(0)|答案(4)|浏览(150)

electron中,可以通过ipcRenderer.sendSync('synchronous-message', 'ping')从IpcRenderer向IpcMain发送同步消息。
也可以使用window.webContents.send('ping', 'whoooooooh!')从IpcMain向IpcRenderer发送blog消息
但是有没有办法从IpcMain向IpcRenderer发送sync消息呢?

nhjlsmyf

nhjlsmyf1#

ipcMain * 没有这样的功能。但是,您可以通过以下步骤异步实现几乎相同的结果:

  • 将仅在同步调用之后运行的代码放在ipcMain回调中。
  • 使用event.sender.send回复渲染器进程中的ipc消息,结果

使用这种方法计算sum的虚拟示例如下所示:

  • 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(引用自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))
  })
}

  • 我猜主要原因是,从主进程到渲染器进程的同步调用会导致主nodejs进程等待,而主nodejs进程也负责运行渲染器进程。
jutyujz0

jutyujz02#

在渲染器进程中访问主进程对象的最简单方法(同步)

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

字符串
这是从主进程向渲染进程发送消息的方法。(官方示例)

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

hzbexzde

hzbexzde3#

我尝试做同样的事情,我得到的最接近的是,首先从IPCRenderer发送消息,然后从收到的IPCMain事件中返回你想要的内容,这是一段代码:

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

字符串

xiozqbni

xiozqbni4#

是的,可以从IpcRenderer向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
});

字符串
我建议你访问这篇文章,VJEKOSLAV RATKAJEC,他很好地解释了de ipcMain到ipcRenderer之间的通信,反之亦然.
友情链接:http://electron.rocks/different-ways-to-communicate-between-main-and-renderer-process/

相关问题