所以,我在 NodeJS 中创建了一个 API。在一个 API 中,我必须在 mongoose 查询中调用 for 循环。
如何在执行 res.send() 之前等待 forEach 完成?我在下面附上了我的代码。
router.post("/getResult", function (req, res) {
const lottery_id = req.body.lottery_id;
const prizeQuery = Prize.find({"lotid": lottery_id});
let response = [];
prizeQuery.exec(function (err, prizes) {
console.log(prizes.length);
if (err) return res.send({success: 0, data: err});
else {
prizes.forEach(prize => {
let prizeData = {};
const winnerQuery = Winner.find({"id": prize._id});
winnerQuery.exec(function (err, winners) {
if (err) return res.send({success: 0, data: err});
else {
prizeData = {
prize: prize,
winners: winners
};
response.push(prizeData);
}
});
});
}
});
return res.send({success:1, data: response});
});
Run Code Online (Sandbox Code Playgroud)
在上面的代码中, return 在 forEach 完成之前被调用。
因为您在内部运行异步代码forEach
并且forEach
不会等到异步代码完成,所以您必须使用等待原语包装您的异步代码。
此外,您提供的代码将send
在失败时调用两次,因为内部的返回forEach
实际上不会结束封闭函数。
try {
await Promise.all(prizes.map(async (prize) => {
const winners = await Winner.find({"id": prize._id});
response.push({prize, winners});
}))
res.send({success:1, data: response});
} catch (err) {
res.send({success: 0, data: err});
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
698 次 |
最近记录: |