带有 React 的 Electron - ipcRenderer 收到来自之前发送给 ipcMain 的消息的回复?

问题描述 投票:0回答:0

所以我对 Electron 很陌生,我的目标是拥有一个完全离线的应用程序,可以有效地查询和显示加载的 SQLite 文件的结果(因此这里有问题的 SQL 实践)。

我能够查询我的数据库并获得预期的回报。但是,当我像这样连续调用时,第二个查询得到的结果与上一个调用相同。这是来自我的渲染器 (React) 的部分。第一个查询通常会按预期进行,但第二个

res
与第一个相同。但是,有时第二个查询会得到预期的结果,而第一个查询与此相同。无论哪种方式,它们最终都具有相同的 res 值。

关于到底发生了什么以及如何解决这个问题的任何想法?我不相信 ipcMain 可以使用同步方法。

渲染器中的代码(React)

// called from ipcMain when database file is set
    ipcRenderer.on('set-db', (event, arg) => {
        // Get authors
        queryDB("SELECT * FROM users;")
        .then((res) => {
            try {
                var options = [];
                res.forEach((e) => {
                    options.push({value: e.id, label: `@${e.name}`});
                    if (e.display_name != e.name) {
                        options.push({value: e.id, label: `@${e.display_name}`});
                    }
                });
                setAuthorOptions(options);
                console.log("Set author options");
            }
            catch (exception) {}
        });

        // Get channels
        queryDB("SELECT * FROM channels;")
        .then((res) => {
            try {
                var options = [];
                res.forEach((e) => {
                    if (allowedChannelTypes.includes(e.type)) {
                        options.push({value: e.id, label: `# ${e.name}`});
                    }
                });
                setChannelOptions(options);
                console.log("Set channel options");
            }
            catch (exception) {}
        });

    });

这里是主流程中的代码

ipcMain.on('asynchronous-message', (event, sql) => {
    if (db) {
        db.all(sql, (error, rows) => {
            event.reply('asynchronous-reply', (error && error.message) || rows);
        });
    }
    return
});

渲染器代码

export default function queryDB(sql) {
    return new Promise((res) => {
        ipcRenderer.once('asynchronous-reply', (_, arg) => {
            res(arg);
        });

        ipcRenderer.send('asynchronous-message', sql);
    })
}
reactjs asynchronous electron ipcrenderer ipcmain
© www.soinside.com 2019 - 2024. All rights reserved.