Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

117
Views
Javascript no espera en la función asíncrona Firebase Realtime Database Set

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!

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

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"); }
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!