获得嵌套承诺的最终价值

时间:2020-11-11 13:33:16

标签: javascript reactjs firebase google-cloud-firestore

在使用嵌套的Promise时,我无法完全弄清楚在以下实现中出了什么问题。 仍在尝试学习并完全理解诺言。

代码在其功能中显示了嵌套的承诺。 “ arrangeAll”等待从“ auxStorageDownload”中发生的存储中收集图像。

function getCurrentShop (userUID){
    const tudo = firestore
    .collection('na_publications')
        .doc(userUID)
            .collection('user_na_publications1')
    let array = []
    tudo.get().then(snapshot => {
        snapshot.forEach(doc => {
            array.push(doc.data())
          })
    }).then(() => {
            arrangeAll(array, userUID).then(res => console.log(res))
        
        }    
    )
}

async function arrangeAll (array, userUID) {
    const promises = array.map((elem, i) => {
        const result = auxStorageDownload(userUID, elem)
        return result
    })

    await Promise.all(promises).then(promise => {
        console.log(promise)
    })

}

async function auxStorageDownload (userUID, elem) {      
    let aux = []
    const promises2 = elem.images.map(photoName => {  //Fotos de cada publicacao
        let result = storage.ref(`publications/${userUID}/${elem.nomeStorage}/${photoName}`).getDownloadURL()
        return result
    })

    await Promise.all(promises2).then(promise => {
        console.log(promise)
    })
    return promises2
}

如您在第二幅图像中所见,promise会收集有关具有多张照片的3种出版物的图像(浏览器控制台)。

browser console

但是在“ arrangeAll”函数中收到的值是承诺,我想在这里使用它们为网站上的出版物构建最终结构。

1 个答案:

答案 0 :(得分:1)

这是错误的:

    await Promise.all(promises).then(promise => {
        console.log(promise)
    })

您需要:

  • 从函数中返回承诺。
  • 如果您希望将这些功能记录在then的功能中,则还需要从该功能中返回它们。

直接修复您的代码:

    return await Promise.all(promises).then(promises => {
        // promises is an array of resolved values here
        console.log(promises)
        return promises;
    })

在上面的代码中,也可以删除await ,因为无论如何,返回的Promise仍将由外部调用函数(调用await的函数arrangeAll进行修改。


如果您想要更清洁的解决方案:

  • 更改arrangeAll的结尾:
async function arrangeAll (array, userUID) {
    const promises = array.map((elem, i) => {
        const result = auxStorageDownload(userUID, elem)
        return result
    })

    return Promise.all(promises);
}
  • 如果要在返回之前记录它们:
async function arrangeAll (array, userUID) {
    const promises = array.map((elem, i) => {
        const result = auxStorageDownload(userUID, elem)
        return result
    })

    const resolved = await Promise.all(promises);
    console.log(resolved) /// resolved is an array
    return resolved;
}