javascript - Mysql node.js async,等待查询完成
问题描述
一直在尝试一切以使其特别适用于 async each 方法。for (resultsHistory 的 const 元素) 也不起作用。
我正在尝试通过在其上运行 foreach 并执行 mysql 查询来修改先前查询的结果数组。
但是,这需要等待查询完成。
有没有办法在没有我手动放置的 setTimeout(function() { } 以等待查询完成的情况下访问这些结果?
function getUserLikes(params, callback) {
var usersArrayCat = [];
console.log(`length of array ${params.length}`)
// 1 here means 1 request at a time
async.eachLimit(params, 1, function (element, cb) {
element.liked = 0;
var queryLiked = `SELECT * from users_likes WHERE user_id = \"${req.body.userid}\" AND product_id = \"${element.product_id}\"`;
connectionPromise.query(queryLiked, function (err, result) {
if (!result) {
} else if (result.length == 0) {
} else {
element.liked = result[0].userlike;
usersArrayCat.push(element);
// console.log(usersArrayCat);
cb();
}
})
}, function (err) {
if (err) return callback(err);
callback(null, usersArrayCat)
});
};
getUserLikes(resultsHistory, function (e) {
console.log(e);
});
if(!res.headersSent) {
setTimeout(function() {
res.send(JSON.stringify({"status": 200 ,"error": null, "top3":resultsHistory}));
}, 150);
}
解决方案
看我的回答:
function getUserLikes(params, callback) {
var usersArrayCat = [];
console.log(`length of array ${params.length}`)
// 1 here means 1 request at a time
async.eachLimit(params, 1, function (element, cb) {
element.liked = 0;
var queryLiked = `SELECT * from users_likes WHERE user_id = \"${req.body.userid}\" AND product_id = \"${element.product_id}\"`;
connectionPromise.query(queryLiked, function (err, result) {
if (!result) {
} else if (result.length == 0) {
} else {
element.liked = result[0].userlike;
usersArrayCat.push(element);
// console.log(usersArrayCat);
}
cb();
})
}, function (err) {
if (err) return callback(err);
callback(null, usersArrayCat)
});
};
getUserLikes(resultsHistory, function (e, usersArrayCat) {
if (e) {
console.log(e);
return res.send({status: 400, error: e}); // your error response
}
console.log(usersArrayCat); // your usersArrayCat with liked property
res.send(JSON.stringify({ // why your need return a string intead of json object ???
"status": 200,
"error": null,
"top3": usersArrayCat // I think return `usersArrayCat` is a right way
}));
});
推荐阅读
- azure-cosmosdb - 如何更改 cosmosDB 中的 API?
- codeigniter - 无法使用 twilio 自动发送短信
- c++ - 在 Qt5 中使用 QMediaPlayer 播放流时使用代理?
- r - xtable中的双行
- sql - 需要从行更改为列
- python - 试图了解我用 manim 得到的菜单来自哪里
- reactjs - React 组件的不需要的 prop 是否应该在 defaultProps 内
- html - 如何将文本左右放置在图像中的页脚中
- python - Dataframe 使用方括号设置值,不遵循 Dataframe 传递的顺序
- android - 在哪里使用噪声抑制器?