簡體   English   中英

如何在 electron 中通過 IPC 發送復雜的 object?

[英]How to send complex object over IPC in 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)
    })
}

當通過console.log打印result.value.data時,它會顯示正確的數據(來自 SQL 查詢):

{ stocks: [{id: 1, ticker: "BRK.B", action: "ADD", price: 173.97, shares: 6}, ...], ...}

但是,當它在ipcMain.on('asynchronous-message', ...)中打印時,它會為值打印空 arrays :

{ stocks: [], crypto: [], vehicles: [], property: [] }

如何發送帶有復雜 object 的 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)
        }
    })
}

其中每一行都是一個 object,如下所示:

{id: 1, ticker: "AAPL", action: "ADD", price: 100.0,
shares: 10, datetime: "2020-05-14 23:24:50", platform: ""}

在@Estradiaz 的幫助下,我意識到 promise 在 SQL 查詢被處理之前就已經解決了。 為了解決這個問題,我從使用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)
        }
    })
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM