Estoy atascado en un problema en el que analizo los resultados de una API en getSubscriptions() . Esto llama a getUserSubs() que devuelve el siguiente objeto:
Cuando llamo a subscriptions , obtengo el fragmento esperado de la consola de matrices (consulte "Obras").
Pero cuando trato de iterar en las subscriptions de matriz (consulte "No funciona"), ni siquiera se llama al contenido de la función.
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)Sé que hay preguntas similares, pero después de leerlas, todavía no puedo resolver mi problema.
Problemas similares:
getUserSubs(userId).then(subscriptions => { console.log(subscriptions) // Works as intended }
No, no lo hace. Solo aparece así porque está inspeccionando la matriz en vivo que se mutó después de haberla registrado en la consola .
Tampoco funciona:
let a = [] getUserSubs(userId).then(subscriptions => { subscriptions.forEach(x => a.push(x)) }) console.log(a)
Sí, por razones bastante obvias : la matriz se registra antes de que la llene. Tendría que ser cualquiera
getUserSubs(userId).then(subscriptions => { let a = [] subscriptions.forEach(x => a.push(x)) console.log(a) })o
let a = [] const subscriptions = await getUserSubs(userId) subscriptions.forEach(x => a.push(x)) console.log(a) Pero ninguno de estos resolverá su problema central: getUserSubs devuelve una matriz vacía antes de que se llene, en las líneas
subIds.forEach(subRef => { const docRef = subRef.data() getDocData(docRef.product).then(product => { subList.push(product) }) }) return subList nunca espera la promesa getDocData . Si cambias eso a
let subList = [] for (const subRef of subIds) { const docRef = subRef.data() const product = await getDocData(docRef.product) subList.push(product) } return subListo solo
return Promise.all(subIds.map(subRef => { const docRef = subRef.data() return getDocData(docRef.product) }))funcionaría, como se describe en la pregunta que ya encontró .
(Es posible que esto aún no funcione. subIds se parece sospechosamente a una instantánea de Firebase, que no es una matriz y no se puede iterar ni tiene un método .map . En ese caso, deberá usar forEach + push manualmente ).
Honestamente, no usaría el método forEach(). Creo que todo lo que necesita hacer para solucionar esto es iterar sobre los resultados en un bucle for normal.
for(let subscription of subscriptions) { console.log(subscription); } OR for(let index in subscriptions) { console.log(subscriptions[index]); }Si esto no funciona, abriré una caja de arena y miraré más a fondo.