【问题标题】:Electron ipcMain & ipcRenderer fail to communicate with each otherElectron ipcMain & ipcRenderer 无法相互通信
【发布时间】:2021-07-22 19:14:06
【问题描述】:

我正在使用电子 js 编写一个桌面应用程序,我想将数据从我的主进程发送到我的渲染器进程,反之亦然。为此,我使用了ipcMainipcRenderer,但奇怪的是,虽然能够使用ipcRenderer.send() 通过我的渲染器发送数据,但我无法使用ipcRenderer.on() 从我的主进程接收任何数据。它只是由于某种原因不起作用。

之后我尝试按照电子文档编写测试来查找错误。然而,测试根本不起作用,因为两个进程似乎都无法向另一个进程发送一些东西。这是我为测试编写的代码:

ma​​in.js

const { app, ipcMain, BrowserWindow } = require('electron');

const createWin = async () => {
    const win = new BrowserWindow({
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
        },
    });
    win.loadFile('./index.html');
    return new Promise((resolve, reject) => {
        win.once('ready-to-show', () => {
            resolve();
        });
    });
};

app.whenReady().then(async () => {
    const win = await createWin();
    console.log('Ready to show');

    ipcMain.on('asynchronous-message', (event, arg) => {
        console.log(arg); // prints "ping"
        event.reply('asynchronous-reply', 'pong');
    });

    ipcMain.on('synchronous-message', (event, arg) => {
        console.log(arg); // prints "ping"
        event.returnValue = 'pong';
    });
});

index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Test, please work</title>
    </head>
    <body>
        <script src="./app.js"></script>
    </body>
</html>

app.js:

const { ipcRenderer } = require('electron');

console.log(ipcRenderer.sendSync('synchronous-message', 'ping')); // prints "pong"

ipcRenderer.on('asynchronous-reply', (event, arg) => {
    console.log(arg); // prints "pong"
});
ipcRenderer.send('asynchronous-message', 'ping');

这是渲染器记录的内容:

{ error: "reply was never sent" }

这里是我获得代码的文档的链接:https://www.electronjs.org/docs/api/ipc-main#sending-messages

【问题讨论】:

  • 我看不到“从未发送过答复”的记录位置。那是来自 Electron 的东西吗
  • 所以你不能中断异步消息处理程序?
  • 浏览器窗口中正在记录错误消息。我怎么能闯入异步消息处理程序? @pushkin

标签: javascript node.js electron ipc


【解决方案1】:

发生这种情况是因为您连接事件处理程序太晚了。

您只是在页面加载后添加ipcMain.on 并且ready-to-show 已触发。您应该提前设置它们,就像在创建窗口之前一样,或者只删除 await createWin() 中的 await

作为参考,Electron 抛出错误here

【讨论】:

  • 非常感谢您的帮助
猜你喜欢
  • 2021-08-01
  • 2018-05-15
  • 2017-08-21
  • 2021-11-29
  • 1970-01-01
  • 2019-08-11
  • 2018-10-03
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多