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(...)
是将消息发送回另一个进程的惯用方式,您不应该回避它。