¿Cómo accedo al valor devuelto por la promesa de Firestore?
Estoy tratando de acceder a lo que devuelve secondSnapshot.data(), pero tengo un problema, como se describe en los comentarios de abajo. Intenté crear una función asincrónica, pero no funcionó. ¿Alguna idea de qué está saliendo mal? Por favor, consulte los 2 comentarios.
useEffect(() => {
firestore.collection(`comentarios`).onSnapshot((snapshot) => {
const posts = snapshot.docs
.map((doc) => {
const address = doc.data().comments?.map((comment) => {
comment.get().then((secondSnapshot) => {
console.log("snapshot", secondSnapshot.data());
#VEO LO QUE ESPERO VER
return secondSnapshot.data();
});
});
console.log(address) #¡ESTO DEVUELVE INDEFINIDO POR ALGUNA RAZÓN?
return {
username: doc.data().username,
date: doc.data().date.seconds,
text: doc.data().text,
votes: doc.data().votes,
comments: [],
};
});
props.setComments(posts);
});
}, [location]);
davy.ai
Parece que el problema está en que
address
no está definido porque no se está devolviendo nada. Esto se debe a quecomment.get()
devuelve una promesa, y el valor devuelto por.map()
en este caso no se está esperando antes de ser devuelto. Para solucionarlo, puede usarPromise.all()
para esperar a que todas las promesas se resuelvan antes de devolver la matrizaddress
. Aquí hay un ejemplo de cómo se puede hacer:Al usar
Promise.all()
para esperar a que todas las promesas se resuelvan, nos aseguramos de que la matrizaddress
esté poblada con los datos recuperados de los documentos decomment
. Tenga en cuenta que también necesitamos marcar la funciónmap()
comoasync
para poder usarawait
dentro de ella.