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

如何在Prisma异步函数中向外部数组push数据

问题原因

_.forEach 不支持异步函数的等待逻辑。当你用异步函数作为_.forEach的回调时,遍历过程会直接启动所有异步任务,但不会等待它们全部完成。因此你执行最后的console.log(buildings)时,那些Prisma查询还没结束,push操作尚未执行,数组自然为空。

解决方案

有两种常用的解决方式,根据你的需求选择:

方式一:使用for...of循环(串行执行)

这种方式会逐个等待每个异步查询完成后再执行下一个,适合需要控制并发顺序的场景:

const buildings = [];
const companies = await prisma.user.findMany({
  where: {
    maintainers: {
      some: {
        id: req.user.id,
      },
    },
  },
});

console.log(companies);

for (const c of companies) {
  const edifici = await prisma.building.findMany({
    where: {
      TU: {
        some: {
          TU: {
            id: c.id,
          },
        },
      },
    },
  });
  console.log(edifici);
  buildings.push(...edifici);
}

console.log(buildings);

方式二:使用Promise.all+map(并行执行)

这种方式会同时启动所有异步查询,等待全部完成后合并结果,执行效率更高,适合无依赖的异步操作场景:

const companies = await prisma.user.findMany({
  where: {
    maintainers: {
      some: {
        id: req.user.id,
      },
    },
  },
});

console.log(companies);

// 为每个公司生成查询Promise
const buildingPromises = companies.map(c => prisma.building.findMany({
  where: {
    TU: {
      some: {
        TU: {
          id: c.id,
        },
      },
    },
  },
}));

// 等待所有查询完成,合并结果为一维数组
const buildings = (await Promise.all(buildingPromises)).flat();

console.log(buildings);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:05:09