如何从回调函数中返回值?Electron ipcMain场景技术求助
解决Electron中ipcMain回调异步返回值问题
你的问题核心是异步操作的时序问题:foo函数内部是数据库异步查询,当ipcMain.handle执行到return menuData时,回调里的menuData = response还未执行,因此返回undefined。
解决方案:用Promise+async/await处理异步逻辑
把基于回调的异步操作改成Promise风格,配合async/await让ipcMain.handle能等待异步结果完成后再返回。
1. 改造foo函数为Promise形式
将回调式的数据库查询封装成Promise,把异步结果和错误分别通过resolve、reject传递:
function foo() { return new Promise((resolve, reject) => { db.all("SELECT * FROM projects", (err, res) => { if (err) { reject(err); // 传递查询错误 } else { resolve(res); // 传递查询结果 } }); }); }
2. 修改ipcMain.handle为异步函数
使用async/await等待foo的异步执行结果,再返回给preload.js:
ipcMain.handle("get-menu-data", async () => { try { const menuData = await foo(); console.log(menuData); // 此时已拿到数据库返回的正确数据 return menuData; } catch (err) { console.error("菜单数据查询失败:", err); throw err; // 抛出错误,让前端调用方可以捕获处理 } });
3. preload.js端的调用示例
ipcRenderer.invoke方法原生支持Promise,可直接接收主进程返回的异步结果:
const { contextBridge, ipcRenderer } = require('electron'); contextBridge.exposeInMainWorld('electronAPI', { getMenuData: () => ipcRenderer.invoke('get-menu-data') });
渲染进程中调用获取数据:
window.electronAPI.getMenuData() .then(menuData => { // 处理拿到的菜单数据 console.log(menuData); }) .catch(err => { // 处理查询错误 console.error(err); });
内容的提问来源于stack exchange,提问作者Shoshin
相关产品推荐
相关产品推荐

