首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >电子ipcMain和ipcRenderer无法相互通信

电子ipcMain和ipcRenderer无法相互通信
EN

Stack Overflow用户
提问于 2021-04-29 12:05:47
回答 1查看 1.6K关注 0票数 2

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

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

main.js

代码语言:javascript
复制
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

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Test, please work</title>
    </head>
    <body>
        <script src="./app.js"></script>
    </body>
</html>

app.js:

代码语言:javascript
复制
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');

以下是Renderer记录的内容:

代码语言:javascript
复制
{ error: "reply was never sent" }

下面是指向我从:https://www.electronjs.org/docs/api/ipc-main#sending-messages获得代码的文档的链接

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-01 14:56:18

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

您只是在页面加载并启动ipcMain.on之后才添加ready-to-show。您应该提前设置它们,比如在创建窗口之前,或者只需删除await createWin()中的await createWin()

作为参考,电子抛出错误这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67317027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档