有没有办法暂停迭代map函数,这样我就可以从查询中获得响应并将其存储在某个对象中。
所以我的数据是一个对象数组,我想添加属性"接收器"对于数组中的每个单个对象,所以我使用map功能循环遍历我的数组,问题在于回调:D,我的对象在我的快递发送响应后重新启动数据所以我不得不对Timeout做出反应,我知道它不是正确的解决方案但是它现在有效,因为我在数据库中只有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);
我正在使用express用于我的API路由和MySQL模块用于节点,也许我可以使用节点中的Promises或异步函数,我不知道。
你有什么想法吗?
答案 0 :(得分:3)
如果您不想重构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
});
});
或类似的东西。