aunque pensé que entendía la esencia de cómo funcionan las funciones asíncronas en JS, esta no espera correctamente. Función externa, manejo de una red social como presionar un botón:
if (!postLiked){ likePost (uid, cardData) .then (getPostLiked(uid)) .catch (error => console.log (error)) }Ahora la función likePost, actualizando datos en la base de datos en tiempo real de firebase:
export function likePost(uid, cardData) { return new Promise((resolve, reject) => { //do stuff with the data... set(ref(db, `${cardData.path}/likeData`), { likeUids: newLikeUids, likeCount: newLikeCount }) .then (() => resolve ("DB: Uid like entry modified")) .catch (error => reject (error)) }) }Comportamiento esperado: primero se le da Me gusta a la publicación, luego se actualiza el estado de Me gusta de la publicación, lo que indica un Me gusta exitoso. Comportamiento mostrado: la función getpostLiked no espera la ejecución de likePost, no actualiza el estado de like.
Por favor, ayúdenme a encontrar el error... en otros casos, usar la expresión then después de set siempre ha funcionado bien...
¡Muchas gracias!
El problema es
likePost(uid, cardData) .then(getPostLiked(uid))Esto es esencialmente equivalente a
const result = getPostLiked(uid); likePost(uid, cardData) .then(result) Está llamando a getPostLiked inmediatamente en lugar de llamarlo solo cuando se resuelve la promesa likePost . cambiarlo a
.then(() => getPostLiked(uid)) También sería una buena idea evitar el antipatrón de construcción Promise explícito; dado que set ya devuelve una Promise, no hay necesidad de construir otra a su alrededor.
export function likePost(uid, cardData) { return set(ref(db, `${cardData.path}/likeData`), { likeUids: newLikeUids, likeCount: newLikeCount }); } Si el propósito del constructor Promise era cambiar el valor de resolución, hágalo con un .then después del set en lugar de envolverlo en otra Promise.
export function likePost(uid, cardData) { return set(ref(db, `${cardData.path}/likeData`), { likeUids: newLikeUids, likeCount: newLikeCount }) .then(() => "DB: Uid like entry modified"); }