在使用嵌套的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种出版物的图像(浏览器控制台)。
但是在“ arrangeAll”函数中收到的值是承诺,我想在这里使用它们为网站上的出版物构建最终结构。
答案 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;
}