Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

121
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda