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

122
Vistas
Promise dentro de Promise crea un bucle sin fin

Tengo una configuración de Promise para hacer una llamada Http así (se ha agregado todo el código):

 callHttpClient({ method, endpoint, payload }) { return new Promise((resolve, reject) => { axios({ method: method, url: endpoint, data: payload, }).then( (response) => { if (response.status == httpStatusCodes.OK) { if (response.data == undefined) { reject(response); } else { logEventMixIn.methods.pushEvent('ApiResponse','Success', true); resolve(response); } } }, ); }); },

La bandera true en pushEvent activará otra llamada dentro del archivo logEventMixin.js que también terminará devolviendo una Promesa:

 pushEvent(category, action, shouldLogToDatabase) { var payload = { userId: getUserId(), sessionKey: getSessionKey(), pageName: getPageName(), sessionId: getSessionId(), }; if(shouldLogToDatabase) { httpHelperMixIn.methods.callEndpoint("https://pushEventEndpoint.com", payload); // ** ^^ This returns a Promise ^^ ** } .... },

El problema es que cuando paso mi indicador como true a este método, en realidad termino en un bucle sin fin llamando al mismo punto final de la API miles de veces. Creo que tiene algo que ver con la cadena Promise, ya que si coloco otra llamada de Axios directamente en logEventMixin.js , ya no tengo el problema (así)

 pushEvent(category, action, shouldLogToDatabase) { var payload = { userId: getUserId(), sessionKey: getSessionKey(), pageName: getPageName(), sessionId: getSessionId(), }; if(shouldLogToDatabase) { axios({ method: "POST", url: "https://pushEventEndpoint.com", data: payload, }).then((response) => { Promise.resolve(response); }

¿Qué estoy haciendo mal?

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

0

Creo que no estás manejando la Promesa por completo, prueba...

 callHttpClient({ method, endpoint, payload }) { return new Promise((resolve, reject) => { axios({ method: method, url: endpoint, data: payload, }).then( (response) => { if (response.status == httpStatusCodes.OK) { if (response.data == undefined) { reject(response); } else { logEventMixIn.methods.pushEvent('ApiResponse','Success', true).then(() => { resolve(response); // <!-- you should be resolving only when `pushEvent` resolves }); } } }, ); }); },

y también -

 pushEvent(category, action, shouldLogToDatabase) { var payload = { userId: getUserId(), sessionKey: getSessionKey(), pageName: getPageName(), sessionId: getSessionId(), }; if(shouldLogToDatabase) { return httpHelperMixIn.methods.callEndpoint("https://pushEventEndpoint.com", payload); // you need to return the above Promise.... } // also return a Promise here for your other code... .... },
about 4 years ago · Juan Pablo Isaza Denunciar

0

Hemos determinado en los comentarios que la fuente del bucle es la recursividad indirecta, en la que realizar una llamada remota para registrar una llamada remota exitosa genera un bucle. La solución es no registrar los registros.

Los problemas con el código de promesa son en su mayoría estilísticos, pero importantes porque, como mínimo, ocultan los errores. Lo siguiente es más o menos equivalente al código OP, pero más conciso y estilísticamente correcto...

 async callHttpClient({ method, endpoint, payload }) { const response = await axios({ method: method, url: endpoint, data: payload, }); logEventMixIn.methods.pushEvent('ApiResponse','Success', false); // "fire and forget" don't await, and don't log the log return response; } async pushEvent(category, action, shouldLogToDatabase) { var payload = { userId: getUserId(), sessionKey: getSessionKey(), pageName: getPageName(), sessionId: getSessionId(), }; if (shouldLogToDatabase) { return httpHelperMixIn.methods.callEndpoint("https://pushEventEndpoint.com", payload); } else { // do something else with payload return Promise.resolve(); } }

Tenga en cuenta que no menciona el manejo de errores. El código OP tampoco, pero esa deficiencia está disfrazada en el código OP con la presencia de un reject aquí o allá.

El mejor patrón en el manejo de errores es lanzar cuando se encuentra un error y detectar cuando se puede hacer algo al respecto, generalmente al principio de la cadena de llamadas.

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