簡體   English   中英

Electron ipcMain & ipcRenderer 無法相互通信

[英]Electron ipcMain & ipcRenderer fail to communicate with each other

我正在用 electron js 編寫一個桌面應用程序,我想將數據從我的主進程發送到我的渲染器進程,反之亦然。 為此,我正在使用ipcMainipcRenderer ,但奇怪的是,雖然能夠使用ipcRenderer.send() ipcRenderer.on()我的主進程接收任何數據。 它只是由於某種原因不起作用。

之后,我嘗試按照電子的文檔編寫測試來查找錯誤。 然而,該測試根本不起作用,因為兩個進程似乎都無法向另一個進程發送一些東西。 這是我為測試編寫的代碼:

主.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';
    });
});

索引.html

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

應用程序.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

發生這種情況是因為您連接事件處理程序太晚了。

您僅在頁面加載並ready-to-show觸發后添加ipcMain.on 您應該更早地設置它們,就像在創建 window 之前一樣,或者只是刪除await await createWin()中的等待。

作為參考, Electron 在這里拋出錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM