Javascript 电子商务;他们不能互相交流

Javascript 电子商务;他们不能互相交流,javascript,node.js,electron,ipc,Javascript,Node.js,Electron,Ipc,我正在用electron js编写一个桌面应用程序,我想将数据从主进程发送到渲染器进程,反之亦然。为此,我使用了ipcdain和ipcdrenderer,但奇怪的是,虽然能够使用ipcdrenderer.send()通过我的渲染器发送数据,但我无法使用ipcdrenderer.on()从我的主进程接收任何数据。只是因为某些原因它不起作用 之后,我根据electron的文档编写了一个测试,试图找到这个bug。但是,测试根本不起作用,因为两个进程似乎都无法向另一个进程发送内容。这是我为测试编写的代码

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

之后,我根据electron的文档编写了一个测试,试图找到这个bug。但是,测试根本不起作用,因为两个进程似乎都无法向另一个进程发送内容。这是我为测试编写的代码:

main.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';
    });
});
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Test, please work</title>
    </head>
    <body>
        <script src="./app.js"></script>
    </body>
</html>
index.html

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';
    });
});
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Test, please work</title>
    </head>
    <body>
        <script src="./app.js"></script>
    </body>
</html>
以下是渲染器记录的内容:

{ error: "reply was never sent" }

下面是我获取代码的文档链接:

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

您仅在加载页面并且启动了准备显示的
后添加
ipcMain.on
。您应该更早地设置它们,就像在创建窗口之前一样,或者删除
await createWin()
中的
await


作为参考,Electron抛出错误

我看不到“从未发送回复”被记录在哪里。这是来自Electronso的东西吗?您不能在异步消息处理程序中中断?错误消息正在浏览器窗口中记录。我怎样才能进入异步消息处理程序@非常感谢你的帮助