[英]Can't iterate through array from an async Javascript function?
我被困在一个问题上,我正在解析getSubscriptions()
中 API 的结果。 这会调用getUserSubs()
,它会返回以下 object:
当我调用subscriptions
时,我得到了预期的数组控制台(参见“Works”)片段。
但是当我尝试迭代数组subscriptions
时(请参阅“不起作用”),甚至不会调用 function 的内容。
async function getUserSubs(userId) {
const ref = collection(db, "users", userId, "subscriptions")
let subList = []
try {
const subIds = await getDocs(ref)
subIds.forEach(subRef => {
const docRef = subRef.data()
getDocData(docRef.product).then(product => {
subList.push(product)
})
})
return subList
} catch (e) {
console.error("Error in getting subscriptions: ", e)
return []
}
}
function getSubscriptions(userId) {
getUserSubs(userId).then(subscriptions => {
console.log(subscriptions) // Works as intended
}
}
function getSubscriptions(userId) {
getUserSubs(userId).then(subscriptions => {
subscriptions.forEach(x => {
console.log(x) // ISSUE: This isn't called
})
}
let a = []
getUserSubs(userId).then(subscriptions => {
subscriptions.forEach(x => a.push(x))
})
console.log(a)
我知道有人问过类似的问题,但在阅读后我仍然无法解决我的问题。
类似问题:
getUserSubs(userId).then(subscriptions => { console.log(subscriptions) // Works as intended }
不,它没有。 之所以出现,是因为您正在检查在记录到控制台后发生变异的实时数组。
也不起作用:
let a = [] getUserSubs(userId).then(subscriptions => { subscriptions.forEach(x => a.push(x)) }) console.log(a)
是的,出于相当明显的原因:在填充数组之前记录数组。 它需要是
getUserSubs(userId).then(subscriptions => {
let a = []
subscriptions.forEach(x => a.push(x))
console.log(a)
})
或者
let a = []
const subscriptions = await getUserSubs(userId)
subscriptions.forEach(x => a.push(x))
console.log(a)
但是这些都不能解决您的核心问题: getUserSubs
在填充之前返回一个空数组,在行中
subIds.forEach(subRef => {
const docRef = subRef.data()
getDocData(docRef.product).then(product => {
subList.push(product)
})
})
return subList
您无需等待getDocData
promise。 如果您将其更改为
let subList = []
for (const subRef of subIds) {
const docRef = subRef.data()
const product = await getDocData(docRef.product)
subList.push(product)
}
return subList
要不就
return Promise.all(subIds.map(subRef => {
const docRef = subRef.data()
return getDocData(docRef.product)
})
正如您已经找到的问题中所述,它会起作用。
(这可能仍然行不通subIds
看起来很像 firebase 快照,它不是数组,既不能迭代,也没有.map
方法。在这种情况下,您需要手动使用forEach
+ push
)。
老实说,我不会使用 forEach() 方法。 我认为解决此问题所需要做的就是在正常的 for 循环中迭代结果。
for(let subscription of subscriptions) {
console.log(subscription);
}
OR
for(let index in subscriptions) {
console.log(subscriptions[index]);
}
如果这不能解决问题,我将打开一个沙箱并进行更深入的研究。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.