有没有办法暂停 map 函数的迭代,这样我就可以从我的查询中获得响应并将其存储在某个对象中。
所以我的数据是一个对象数组,我想为数组中的每个对象添加属性“接收器”,所以我使用 map 函数循环遍历我的数组,问题出在回调中:D,我的对象在我之后接收数据express 发送响应,所以我不得不延迟响应超时,我知道这不是正确的解决方案,但它现在有效,因为我在数据库中只有 40-50 条记录。
代码如下:
data.map((x) => {
let sql = `
SELECT username
FROM message
JOIN message2user ON message.message_id = message2user.message_id
JOIN user on message2user.receiver_id = user.user_id
where message.message_id = ?;
`;
testDB.query(sql, x.message_id, (err, dataReceivers) => {
if (err) console.log(err);
x["receivers"] = dataReceivers;
})
});
setTimeout(() => {
res.json({ success: true, data: data });
}, 1000);
我正在为我的 API 路由和 MySQL 使用 express Node 的模块,也许我应该使用来自 Node 的 Promises 或异步函数,我不知道。
你有什么想法吗??
最佳答案
如果您不想重构 SQL 查询,这里有一个使用 Promises
的方法:
const sqlTemplateString = `
SELECT username
FROM message
JOIN message2user ON message.message_id = message2user.message_id
JOIN user on message2user.receiver_id = user.user_id
where message.message_id = ?;
`;
Promise.all(data.map((x) => new Promise((resolve, reject) => {
testDB.query(sqlTemplateString, x.message_id, (err, dataReceivers) => {
if (err) {
reject(err);
} else {
x.receivers = dataReceivers;
resolve(x);
}
});
}))).then((data) => {
res.json({
success: true,
data
});
}).catch((error) => {
console.log(error);
res.json({
success: false,
error
});
});
或者类似的东西。
关于mysql - 用来自多个 mysql 查询的数据填充对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44654871/