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?
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:
¿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 :
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.