He estado trabajando con firebase y tengo problemas con este código.
El objetivo del código es obtener los datos del documento con la identificación del documento.
const getPostData = async (postId) => { const postData = await getDoc(doc(db, 'posts', postId)); console.log(postData.data()); // Returns the document data return postData.data(); } const postData = getPostData(id); console.log(postData) // Returns a promiseEstoy extremadamente confundido porque devuelvo los datos del documento que, cuando registro, me dan los datos reales del documento, pero cuando los configuro como una variable, no hacen lo mismo.
Cuando usa una función como async , devuelve una Promise automáticamente. Así que el problema está en la lógica.
Lo que sucede:
Llamas a getPostData
Es una función async , por lo que su retorno es Promise .
El alcance más grande no es un alcance async , por lo que console.log se ejecuta justo después, sin esperar la ejecución de lo que está dentro de getPostData
console.log devuelve una Promise
Prueba algo como:
const [postData, setPostData]= useState() const getPostData = async (postId) => { const postData = await getDoc(doc(db, 'posts', postId)); if (postData.exists()) { console.log(postData.data()); // Returns the document data setPostData(postData.data()); } else { console.log("No posts!"); } } ... getPostData(id); ... console.log(postData)Dado que ha marcado getPostData como async , devuelve una Promise y no un valor inmediato.
Para obtener el valor de la promesa al llamar a getPostData , puede usar then() :
getPostData(id).then((postData) => { console.log(postData) }) O puede usar await :
const postData = await getPostData(id); console.log(postData)