为什么我的 ipcMain 在读取数据库后返回一个空数组?

Why is my ipcMain returning an empty array after reading through a database?

对于我的项目,我使用电子并与 ipcRenderer 和 ipcMain 反应以与数据库通信。我可以看到它通过数据库,但它 return 是一个空数组。这就像在从数据库读取任何内容之前 returned 数组。

这是我在 ipc main 中使用的代码: 我期待它 return 类别的名称,但它 returns cateNames 空白。

ipcMain.on(channels.GET_CATS, async(event,type) => {
    console.log("made it")
    let cateNames=[];

    db.each(`SELECT name FROM categories WHERE type=?`, [type],(err, row) => {
        if (err) {
            return console.error(err.message);
        }

        console.log(row.name);
        cateNames.push(row.name);
    });
    
    console.log(cateNames);
    event.sender.send(channels.GET_LOGIN, cateNames);
});

我发送请求 ipcRenderer.send(channels.GET_CATS,"Donation"); ipcRenderer.on 侦听会将数组输出到控制台。

Javascript / Node.js 按顺序执行命令,从一个命令移动到下一个命令时不“等待” 除非 明确告知通过使用 promises 和 async / await 命令。

您当前的代码 return 是一个空 cateNames 数组的原因是因为代码的执行不会“等待”db.each 命令到 return 它是打回来。回调仅在 DB 有一些 return 时被 returned,这将是一行或一个错误。这需要时间。与此同时,执行已转移到下一个命令。

要使此代码块“等待”直到数据库 returned 所有可用行(如果有),我们可以使用 promises.

相反,我提出了一种更简单的方法。而不是在每次 db.each 迭代时 pushing row.name,只需使用 db.all 并在之后制作响应。

ipcMain.on(channels.GET_CATS, async(event, type) => {
    console.log("made it")
    let cateNames = [];

    db.all(`SELECT name FROM categories WHERE type=?`, [type], (err, rows) => {
        if (err) {
            return console.error(err.message);
        }

        for (let row of rows) {
            cateNames.push(row.name);
        }
    
        console.log(cateNames);

        // Use event.reply(channel, data);        
        event.reply(channels.GET_LOGIN, cateNames);
    });
});