[英]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.