带有嵌套地图的 Promise.all .. 第一张地图仅适用于其他人在猫鼬中返回空对象
Posted
技术标签:
【中文标题】带有嵌套地图的 Promise.all .. 第一张地图仅适用于其他人在猫鼬中返回空对象【英文标题】:Promise.all with nested map.. First map only work others return empty objects in mongoose 【发布时间】:2020-10-22 00:01:30 【问题描述】:带有嵌套映射的 Promise.all.. 第一个映射仅适用于其他映射在 mongoose nodejs iam 中返回空对象,仅使用一个 promise.all 来扭曲两个映射
这个代码
let foundCategory = await Category.findOne(_id: req.params.id)
let CategoryWithSections = ...foundCategory.toObject(),sectionsOfCategory:
//this map work
await Promise.all( foundCategory.sectionsOfCategory.map(async(SOC)=>
let sections= await Section.findOne(_id: SOC.sectionOfCategory )
return ...sections.toObject(), productsOfSections:
//this map doesn't work
sections.productsOfSection.map(async(POS)=>
return await Product.findOne(_id: POS.productOfSection )
)
// return await sections.filter((section) => section._id === SOC.sectionOfCategory)
) )
【问题讨论】:
你能正确缩进吗? 【参考方案1】:productsOfSections
对象被 sections.productsOfSection.map
填充,这是一组承诺。由于您没有等待它,因此承诺不会立即得到解决。
等待await
总是绑定到它所在的最内部函数。因此await Product.findOne(_id: POS.productOfSection )
只是绑定到async(POS)=>
函数,而不是async(SOC)=>
。
如果您以类似的方式等待内部 .map
的所有承诺,那么它将创建“等待”链,该链将返回所有值
let foundCategory = await Category.findOne(
_id: req.params.id
)
let CategoryWithSections =
...foundCategory.toObject(),
sectionsOfCategory:
//this map work
await Promise.all(foundCategory.sectionsOfCategory.map(async (SOC) =>
let sections = await Section.findOne(
_id: SOC.sectionOfCategory
)
return
...sections.toObject(),
productsOfSections:
//this map doesn't work
await Promise.all(sections.productsOfSection.map(async (POS) =>
return await Product.findOne(
_id: POS.productOfSection
)
))
// return await sections.filter((section) => section._id === SOC.sectionOfCategory)
))
值得一提的是,async
函数只是意味着该函数返回了 Promise,然后您只是在使用 Promise。这意味着这部分可以在没有await
甚至没有async
函数的情况下编写,因为您正在返回promise,因此结果将是promise 数组,这就是Promise.all
可以使用的东西
await Promise.all(sections.productsOfSection.map((POS) =>
return Product.findOne(
_id: POS.productOfSection
)
))
【讨论】:
以上是关于带有嵌套地图的 Promise.all .. 第一张地图仅适用于其他人在猫鼬中返回空对象的主要内容,如果未能解决你的问题,请参考以下文章
.then() 在嵌套的 promise.all 和 fetch 完成之前执行
使用 Array.map 时嵌套承诺,使用 Promise.all 但仍然无法正常工作
Javascript 像 Java 8 上的“Promise.all”(可能带有 lambdas)
节点使用带有 .catch() 语句的 Promise.all 为 Mongoose 请求抛出 UnhandledPromiseRejectionWarning
如何使用带有 Promise.all 的 AsyncData 从多个 api 的工作客户端获取数据但导致 nginx 为 504