如何在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
相关产品推荐
相关产品推荐

