javascript - Electron 中如何通过IPC发送复杂的物体?

标签 javascript electron

我正在使用ipcRenderer.send()将对象数组发送回ipcMain。这是我的代码:

const loadData = async () => {
    let promises = [];
    ['stocks', 'crypto', 'vehicles', 'property'].forEach(item => {
        promises.push(getTableData(item))
    })
    let data = {}
    await Promise.allSettled(promises).then(results => {
        for (let i in results) {
            var result = results[i]
            if (result.status === 'fulfilled') {
                console.log(result.value.type)
                // result.value.data will be an array of objects
                console.log(result.value.data)
                data[result.value.type] = result.value.data
            } else {
                console.error(result)
            }
        }
    }).finally(_ => {
        console.log(data)
        ipcRenderer.send('asynchronous-message', data)
    })
}

通过result.value.data打印console.log时,它显示正确的数据(来自SQL查询):
{ stocks: [{id: 1, ticker: "BRK.B", action: "ADD", price: 173.97, shares: 6}, ...], ...}

但是,当它以ipcMain.on('asynchronous-message', ...)打印时,它会为值打印空数组:
{ stocks: [], crypto: [], vehicles: [], property: [] }

如何发送带有复杂对象的IPC消息?它没有正确序列化吗?

供引用,这是我的ipcMain.on('asynchronous-message', ...)代码:

ipcMain.on('asynchronous-message', async (event, data) => {
  console.log(data)
})

另外,这是getTableData():

const getTableData = (table) => {
    let toReturn = {
        type: `${table}`,
        data: []
    }
    return new Promise((resolve, reject) => {
        try {
            db.run(`PRAGMA table_info('${table}');`, err => {
                if (err) {
                    reject(err)
                } else {
                    db.each(`SELECT * FROM ${table}`, (err, row) => {
                        if (err) {
                            reject(err)
                        } else {
                            toReturn.data.push(row)
                        }
                    })
                    resolve(toReturn)
                }
            })
        } catch (e) {
            reject(e)
        }
    })
}

每行是一个对象,看起来像:
{id: 1, ticker: "AAPL", action: "ADD", price: 100.0,
shares: 10, datetime: "2020-05-14 23:24:50", platform: ""}

最佳答案

在@Estradiaz的帮助下,我意识到在处理SQL查询之前已解决了 promise 。为了解决这个问题,我从使用db.each()切换到db.all()。这是我更新的getTableData():

const getTableData = (table) => {
    let toReturn = {
        type: `${table}`,
        data: []
    }
    return new Promise((resolve, reject) => {
        try {
            DB.run(`PRAGMA table_info('${table}');`, err => {
                if (err) {
                    console.error(err)
                    reject(err)
                } else {
                    DB.all(`SELECT * FROM ${table}`, (err, rows) => {
                        if (err) {
                            console.error(err)
                            reject(err)
                        } else {
                            toReturn.data = rows
                            resolve(toReturn)
                        }
                    })
                }
            })
        } catch (e) {
            console.error(e)
            reject(e)
        }
    })
}

关于javascript - Electron 中如何通过IPC发送复杂的物体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61929714/

相关文章:

javascript - 基于 $(document) jQuery 选择器的自定义事件动态操作

electron - 通过ssh隧道(ngrok)连接到SQL Server

electron - 如何与托盘菜单上的 Electron 单选按钮交互?

javascript - 使用 NodeJS 和 Electron 使用操作系统的默认应用程序(带有 Word 的 docx 等)打开外部文件

javascript - 在没有序列化的情况下在主窗口和窗口之间共享数组

javascript - 为div jQuery中的所有内部td设置背景颜色

javascript - 在 jvector map 上两个标记之间绘制的线的末端绘制箭头

JavaScript 库 - 如何公开回调函数

javascript - Vuex `people[0] = { age: people[0].age + 1 };` 不会触发重新渲染,为什么?

node.js - Electron 生成器使用: ENOENT: no such file or directory,复制文件elevate.exe在 Jenkins 身上失败