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
Comprensión de async/await y promesas

Estoy trabajando en node.js v18.2.0 y aquí está mi código:

 async function res_asyncf(){ await setTimeout(r => {}, 1000); } const res_promise = new Promise(async r => { await setTimeout(r, 1000); }); async function not_res_asyncf(){ while(true){ } } const not_res_promise = new Promise(async r => { }); (async () => { console.log("Async wrapper entered"); await <async_thing_here>; console.log("Promise resolved"); })();

En lugar de <async_thing_here> estaba escribiendo res_asyncf() , res_promise , not_res_asyncf() y finalmente not_res_promise .

El primero no se hizo esperar, cosa que no entiendo.

El segundo se comportó como se esperaba: se colgó por un segundo y luego se imprimió Promise resolved .

El tercero también se comportó como se esperaba: colgó para siempre.

Pero el último simplemente no hizo nada y salió e incluso no imprimió Promise resolved . Esperado: cuelga igual que el tercero.

¿Por qué sucede todo esto?

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

0

Todavía hay confusión sobre async / await . Ponen await delante de todo y esperan que se espere de alguna manera mágica, pero no es así como funciona.

await SOLO tiene sentido usarlo en Promises. setTimeout no devuelve una promesa, por lo que no tiene sentido usarlo en ella.

Si desea usar async / await , solo haga 2 preguntas:

  1. ¿Esta función, método, etc. devuelve una promesa?

    1.1 En caso afirmativo, podría usar async / await

    1.2 Si no, no lo use. Probablemente no tenga sentido.

En tu caso tienes setTimeout :

  1. ¿Devuelve una Promesa?

Bueno, podrías decir, no lo sé.

Pero puedes buscarlo en Google: https://developer.mozilla.org/en-US/docs/Web/API/setTimeout

El timeoutID devuelto es un valor entero positivo que identifica el temporizador creado por la llamada a setTimeout()

Ahora llegamos a

1.2 Si no, no lo use. Probablemente no tenga sentido.

Déjame reescribirlo:

 const res_promise = new Promise(r => { setTimeout(r, 1000); }); function not_res_asyncf(){ while(true){ } } const not_res_promise = new Promise(r => { }); (async () => { console.log("Async wrapper entered"); await not_res_promise; console.log("Promise resolved"); })();

La primera función es una tontería. Técnicamente, puede usar await en setTimeout , no arrojará un error, pero en la práctica simplemente no hace nada.

La segunda función necesita async / await en absoluto.

El tercero tampoco necesita async / await y está bloqueando el hilo principal.

El último también necesita async . No hace nada porque nunca se resolved o rejected . Está en estado pendiente.

La diferencia entre su tercera y última función es:

Su tercera función bloquea todo su hilo principal y hace que su aplicación no responda.

Su última función devuelve una promesa en un estado pendiente que no bloquea su hilo principal y su aplicación aún responde.

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