Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

166
Vistas
¿Cuál es la mejor manera de manejar dos llamadas asíncronas que deben pasar y hacer un cambio "irreversible"?

Actualmente me pregunto sobre este problema, tengo un equipo al que quiero agregar un usuario (así que escriba un nuevo usuario en la base de datos para ese equipo) y también quiero aumentar la cantidad de usuarios por los que el equipo debe pagar ( Yo uso suscripciones de banda).

 async handleNewUser(user, teamId){ await addUserToTeamInDatabase(user, teamId) await incrementSubscriberQuantityInStripe(teamId) }

El problema es, ¿cuál hago primero? Recientemente me encontré con un problema en el que se agregaban usuarios, pero el número de suscriptores no aumentaba. Sin embargo, si los invierto e incremento primero y luego escribo en la base de datos y algo sale mal en esta última parte, el cliente paga más pero no se agrega un nuevo miembro. Una forma posible de abordar esto es con try catch:

 handleNewUser(user, teamId) { let userAddedToDatabase = false let userAddedInStripe = false try { await addUserToTeamInDatabase(user, teamId) userAddedToDatabase = true await incrementSubscriberQuantityInStripe(teamId) userAddedToStripe = true } catch (error) { if (userAddedToDatabase && !userAddedInStripe) { await removeUserFromTeamInDatabase() } } }

Así que estoy escribiendo el nuevo usuario en la base de datos y luego hago una llamada a la API de stripe. ¿Hay una mejor manera de abordar esto porque se siente torpe? Además, ¿hay un patrón para abordar este problema o un nombre para él?

Estoy usando la base de datos en tiempo real de Firebase.

¡Gracias a todos!

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Lo que desea realizar es una transacción. En las bases de datos, una transacción es un grupo de operaciones que tiene éxito si todas sus operaciones tienen éxito. Si al menos una operación falla, no se realizan cambios (todas las demás operaciones se cancelan o revierten).

¡Y Realtime Database admite transacciones! Consulta la documentación

about 4 years ago · Juan Pablo Isaza Denunciar

0

Si ambas operaciones estuvieran en la misma base de datos, normalmente las empaquetaría en una transacción y la base de datos volverá al estado inicial si una de ellas falla. En su caso, tiene operaciones en diferentes sistemas externos (DB y Stripe), por lo que deberá implementar la lógica transaccional usted mismo.

Podría simplificar su ejemplo comprobando de dónde proviene el error en la cláusula catch. Entonces puedes deshacerte de las banderas. Algo como esto:

 handleNewUser(user, teamId) { try { await addUserToTeamInDatabase(user, teamId) await incrementSubscriberQuantityInStripe(teamId) } catch (error) { // If we fail to increment subscriber in Stripe, // cancel transaction by removing user from DB if (instanceof error StripeError) { await removeUserFromTeamInDatabase(user, teamId) } // Re-throw error upstream throw error; } }

Yo uso una instancia de pero tú cambias la lógica condicional para que se ajuste a tu programa.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda