【发布时间】:2021-11-14 09:34:42
【问题描述】:
这里,productIds 具有数组中所有已订购商品的 ID,例如 ["1294382", "2913892"]
所以我试图从 MongoDB 的数据库中获取所有具有这些 ID 的项目。我正在映射它们中的每一个,并将它们存储在orderedItems 数组中。这样我就可以访问数据库中项目的价格(或任何属性)。
productRouter.post("/", async (req, res) => {
const productIds = req.body.orderedItems.map((item) => item.id);
let orderedItems = [];
productIds.map(async (productId) => {
const d = await Product.findById(productId);
orderedItems.push(d);
});
const unusedVariable = await Product.findById("61...da1"); //If i delete that line (or only await), orderedItems returns empty array.
console.log(orderedItems);
});
现在,预期的输出是:
[
{
_id: new ObjectId("614632cc8aa9513567dfbca4"),
name: 'ürün1',
desc: 'ürün1 açıklama',
price: 50,
__v: 0
},
{
_id: new ObjectId("614632cc8aa9513567dfbca2"),
name: 'kartal kupa',
desc: 'kartal resimli kupa',
price: 50,
__v: 0
}
]
我得到了那个输出,但前提是我有等待的未使用变量行。如果我删除该行,或从那里删除“等待”,我得到的输出是: [] 。所以一个空数组而不是用对象填充。
为什么?我该如何解决这个问题(把 unusuedVariable 留在那里?)?这段代码有多糟糕?
【问题讨论】:
-
1.当你的意思是
forEach时,不要使用map(这很令人困惑) 2. 回调中带有 await 的 forEach 循环不会按顺序运行,并且代码不会等待承诺完成。使用const orderedItems = await Promise.all(productIds.map(productId => Product.findById(productId))); -
您应该尝试创建一个 findById 操作数组并将该数组传递给 Promise.all() 并等待。
-
你正在推送一个回调,确保你将回调设为异步,但没有等待回调
标签: javascript node.js mongodb async-await