我正在使用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/