带有嵌套地图的 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

Promise.all 的 then() 函数在 Promise 完成之前执行 - Ionic/Angular