所以我对 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);
})
}