电子框架如何实现像Ajax请求一样的通信



ipcRenderer.sendSync可能会阻塞整个渲染器进程。 ipcRenderer.send需要使用ipcRenderer.on来侦听事件的异步返回。

那么有没有一种方法可以传达数据可以直接作为回调返回,因为它被请求了?

它可能看起来像这样:ipcRenderer.sendAsync('eventName', args, callback),或者通过其他方式。

ipcRenderer.on("onMessage", (e, {cbName, data}) => { 
  switch (cbName) {
    case 'foo1':
      foo1(data)
      break
    case 'foo2':
      foo2(data)
      break
    case 'foo3':
      foo2(data)
      break
    // more
    default:
      break
  }
})
ipcRenderer.send("message", { cbName, /* other args */ })
你需要

的是ipcMain.handle((和ipcRenderer.invoke((这会将承诺返回给渲染器。

// Main process
ipcMain.handle('my-invokable-ipc', async (event, ...args) => {
  const result = await somePromise(...args)
  return result
})
// Renderer process
async () => {
  const result = await ipcRenderer.invoke('my-invokable-ipc', arg1, arg2)
  // ...
}

欲了解更多信息https://www.electronjs.org/docs/api/ipc-main#ipcmainhandlechannel-listener

如果我

理解正确的话,您所要求的是将回调从渲染器进程传递到主进程,并使主调用中的处理程序与响应一起传入它,而不是将其发送回去。

所以与其这样做:

主.js:

ipcMain.on("message", (e, arg) => {
    e.sender.send("onMessage", "response");
});

渲染器.js:

ipcRenderer.send("message", 1);
ipcRenderer.on("onMessage", (e, response) => { });

您要执行此操作:

主.js:

ipcMain.on("message", (e, arg, callback) => {
    callback("response");
});

渲染器.js:

function callback(response) { }
ipcRenderer.send("message", 1, callback);

那么不,你不能这样做,因为你不能像这样跨进程传递函数。即使您.toString()函数,然后通过new Function(...)在主进程中重新创建函数,您也会在主进程的上下文中执行它,而不是渲染器,并且您可能希望在渲染器进程中执行它。

使用 e.sender.send(...) 是将消息发送回另一个进程的惯用方式,您不应该回避它。

最新更新