我遇到了一個問題,即我正在決議getSubscriptions(). 這呼叫getUserSubs()回傳以下物件:

當我呼叫時,subscriptions我得到了預期的陣列控制臺(參見“Works”)片段。
但是當我嘗試對陣列進行迭代時subscriptions(請參閱“不起作用”),甚至不會呼叫函式的內容。
為 API 資料呼叫 userSubs()
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)
我知道有人問過類似的問題,但在閱讀之后我仍然無法解決我的問題。
類似問題:
- 如何訪問承諾的價值?
- 在 forEach 回圈中使用 async/await
uj5u.com熱心網友回復:
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承諾。如果你把它改成
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)。
uj5u.com熱心網友回復:
老實說,我不會使用 forEach() 方法。我認為解決這個問題所需要做的就是在正常的 for 回圈中迭代結果。
for(let subscription of subscriptions) {
console.log(subscription);
}
OR
for(let index in subscriptions) {
console.log(subscriptions[index]);
}
如果這不起作用,我將打開一個沙箱并更深入地查看。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381090.html
標籤:javascript
