You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS+Mongoose项目中forEach循环后数组为空问题排查

问题分析与解决方案

错误原因

  • forEach 是同步遍历方法,它不会等待内部的异步函数执行完成。当外部的 console.log(updatedItems) 执行时,循环里所有的异步操作(await 调用的数据库方法)都还没完成,所以数组还是空的。
  • 循环内部的 console.log 能打印数据,是因为它在两次 await 之后执行,此时当前迭代的异步任务已经完成,数据已经被 push 进数组。

修复方案

方案一:使用 for...of 循环(顺序执行)

for...of 支持异步等待,会逐个执行并等待每个异步任务完成后再进入下一次循环:

const updatedItems: Item[] = [];

for (const purchasedItem of purchaseData.items) {
  const itemInDB = await this.itemService.findItemByName(purchasedItem.name);
  itemInDB.quantity -= purchasedItem.quantity;
  const updatedItem = await this.itemService.updateItem(itemInDB['_id'], itemInDB);
  updatedItems.push(updatedItem);
}

console.log(updatedItems); // 此时能拿到完整的更新后数据

方案二:使用 Promise.all 结合 map(并行执行)

如果你的商品更新操作之间没有依赖关系,可以用这种方式并行处理,效率更高:

const updatedItems = await Promise.all(
  purchaseData.items.map(async (purchasedItem) => {
    const itemInDB = await this.itemService.findItemByName(purchasedItem.name);
    itemInDB.quantity -= purchasedItem.quantity;
    return this.itemService.updateItem(itemInDB['_id'], itemInDB);
  })
);

console.log(updatedItems); // 直接获取所有更新后的结果数组

注意事项

  • 顺序执行适合有依赖的场景(比如前一个商品的更新会影响后一个的计算),但速度较慢;
  • 并行执行效率更高,但要注意数据库的并发压力,避免短时间内发起过多请求。

内容的提问来源于stack exchange,提问作者Tony Stark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:39:46