【发布时间】:2021-01-08 09:03:58
【问题描述】:
尝试构建更复杂的 MySQL 查询返回,但返回不等待 forEach 循环完成。
export const Query = (query: string, values?: Array<string | number>) => {
return new Promise<Array<any>>((resolve, reject) => {
pool.query(query, values, (err, results) => {
if(err) reject(err);
return resolve(results);
});
});
};
const getUsersChats = async(userid: number) => {
let chats = await Query('SELECT * FROM users_chats u JOIN direct_chats d ON d.id = u.chatid WHERE u.userid = ?', [userid]);
//console.log(chats);
let buildReturn: any = [];
const build = async() => {
chats.forEach(async(chat) => {
let buildInnerObject = {};
let lastMsg = await Query('SELECT * FROM messages WHERE chatid = ? ORDER BY created DESC LIMIT 1', [chat.id]);
buildInnerObject = {...chat, lastMSG: lastMsg}
buildReturn.push(buildInnerObject);
});
}
await build();
console.log(buildReturn)
return buildReturn;
}
我正在寻找类似的回报:
{
id: 12,
userid: 28,
chatid: 12,
created: 2021-01-05T23:14:03.000Z,
userid_1: 28,
userid_2: 31,
title: 'Title',
lastMSG: [ [RowDataPacket] ]
},
{
id: 13,
userid: 28,
chatid: 13,
created: 2021-01-05T23:18:40.000Z,
userid_1: 28,
userid_2: 33,
title: 'Title'
lastMSG: []
}
]
但现在我的回报是[]
【问题讨论】:
-
你永远不会调用
build.... 所以它的代码根本没有执行。此外,对每个 chat.id 进行单独查询似乎效率很低。为什么不进行一次查询,将它们全部选中? -
我的错误我忘了发布更新的常量。即使调用 build 时,我的 return 也不会等待。是的,我考虑过这一点,但我不确定如何编写一个查询来选择特定聊天 ID 的最新消息。
标签: javascript asynchronous promise async-await mysqljs