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

134
Views
async espera y la cadena de promesa no está esperando para resolver

Estoy colocando mis llamadas API en una nueva función para poder llamarlas fácilmente con un par de líneas en lugar de una tonelada de código en cada página. El problema que tengo es que la sincronización y la espera se completan antes de devolver los datos.

Obtengo console.log(sess.getIdToken().getJwtToken()) consolado primero, seguido de undefined para console.log(getMessages), luego los datos de console.log(response).

Entonces, await Auth.currentSession().then(...) se ejecuta pero no espera la llamada axios dentro de él. ¿Cómo devuelvo los datos para poder acceder a ellos en el useEffect?

 useEffect(() => { async function getMessages() { const getMessages = await ApiService.getMessages(); console.log(getMessages) } getMessages(); }, []); async getMessages() { return await this.__sendRequest("/default/message", "GET"); } async __sendRequest(url, method) { await Auth.currentSession().then(sess => { console.log(sess.getIdToken().getJwtToken()) axios({ method: method, url: process.env.REACT_APP_USER_URL + url, headers: { "X-TOKEN-ID": sess.getIdToken().getJwtToken(), "addresseeType": "P", "content-type": "application/json" } }).then(function (response) { console.log(response) return response }).catch(err => { console.error(err); }) }) }
about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Mezclar async/await await con el encadenamiento de promesas ( .then(...) ) es una manera realmente fácil de complicar demasiado su código.

Puedo ver un par de lugares que contribuyen a que esto no funcione.

  • En __sendRequest no está devolviendo nada.
  • en el primero, .then te falta un retorno.

Aquí hay un código simplificado y fijo.

 async __sendRequest(url, method) { const sess = await Auth.currentSession() console.log(sess.getIdToken().getJwtToken()) const response = await axios({ method: method, url: process.env.REACT_APP_USER_URL + url, headers: { "X-TOKEN-ID": sess.getIdToken().getJwtToken(), "addresseeType": "P", "content-type": "application/json" } }) console.log(response) return response }

Verifique los comentarios de la otra respuesta, para comprender acerca de async/await , devolución y pila de llamadas https://stackoverflow.com/a/69179763/1728166

about 4 years ago · Juan Pablo Isaza Report

0

Hay un par de problemas:

  1. __sendRequest no tiene return , por lo que cuando termine de esperar, cumplirá su promesa con undefined .
  2. La promesa de la cadena en Auth.currentSession() no espera que la llamada axios se complete porque las dos cadenas no están vinculadas de ninguna manera.
  3. (No es la razón por la que está viendo la liquidación prematura, pero sigue siendo un problema). No atrape los errores demasiado pronto, déjelos propagarse para que la persona que llama sepa que algo salió mal.

Además, en general, no mezcle usando .then / .catch con async / await , no hay necesidad (generalmente); solo usa await :

 useEffect(() => { async function getMessages() { try { const getMessages = await ApiService.getMessages(); console.log(getMessages); } catch (error) { // ...*** handle/report error... } } getMessages(); }, []); async getMessages() { return await this.__sendRequest("/default/message", "GET"); } async __sendRequest(url, method) { const sess = await Auth.currentSession(); console.log(sess.getIdToken().getJwtToken()); return await axios({ method: method, url: process.env.REACT_APP_USER_URL + url, headers: { "X-TOKEN-ID": sess.getIdToken().getJwtToken(), "addresseeType": "P", "content-type": "application/json" } }); }
about 4 years ago · Juan Pablo Isaza Report

0

getMessages() es asíncrono, por lo que debe llamar con await y hacer que la función de devolución de llamada de la primera línea sea asíncrona para que pueda usar await dentro de ella.

 useEffect(async () => { async function getMessages() { const getMessages = await ApiService.getMessages(); console.log(getMessages) } await getMessages(); }, []);

puede simplificar __sendRequest convirtiendo todas las devoluciones de llamada de then() en espera y colocando toda la cadena dentro de un bloque de prueba/captura.

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!