我试图列出发送给客户端的产品,但res.send
在循环完成之前就被执行了。你有什么建议吗?异步/等待似乎不起作用。
这是我的代码:
const Outfits = require("../models/Outfits");
const Products = require("../models/Products");
module.exports = (req, res) => {
Outfits.find({ outfitId: req.params.id }, async (error1, result) => {
if (error1) {
res.status(400).json({
status: "fail",
});
} else {
let productIds = result[0].productIds;
let productList = [];
for (let i = 0; i < productIds.length; i++) {
await Products.find({ id: productIds[i] })
.then((product) => {
console.log(product);
productList.push(product);
})
.catch((error2) => {
res.status(400).json({
status: "fail",
});
});
}
console.log(productList);
res.status(200).json({
status: "success",
body: productList,
});
}
});
};
非常感谢!
为了同时执行多个异步任务,一种更干净的方法是使用Promise.all
并传递异步任务的数组。像这样:
const Outfits = require("../models/Outfits");
const Products = require("../models/Products");
module.exports = (req, res) => {
Outfits.find({ outfitId: req.params.id }, async (error1, result) => {
if (error1) {
res.status(400).json({
status: "fail",
});
} else {
let productIds = result[0].productIds;
//
const productList = await Promise.all(
productIds.map((id) => Products.findById(id))
);
console.log(productList);
res.status(200).json({
status: "success",
body: productList,
});
}
});
};
您需要像这个一样在Products.find
函数上调用await
for (let i = 0; i < productIds.length; i++) {
try {
const product = await Products.find({ id: productIds[i] }).exec()
console.log(product);
productList.push(product);
} catch (error) {
res.status(400).json({
status: "fail",
});
}
}
你有什么建议吗?异步/等待似乎不起作用
代码中的async/await不起作用,因为mongoose为您提供了函数,所以它是
-
回调样式
//找到装备并将装备传递给回调
Outfits.find({outfitId:req.params.id},async(error1,assembly(=>{
//您的其他逻辑
})
-
异步/等待式
//找到装备并返回
const装备=等待Outfits.find({outfitId:req.params.id}(.exec((;
假设您以这种方式检索产品id的数组
let productIds = result[0].productIds;
const products = await Promise.all(
productIds.map((productId)=>{
return Products.findById(productId)
}
)
这将为您检索产品列表
这是我第一次回答一个问题,所以这个答案很努力哈哈:(。