Soy nuevo en JavaScript y estoy tratando de entender qué hace await y cuál es su relación con la cola de microtareas. El siguiente código es solo para fines de aclaración.
async function afunc() { console.log("a1"); const b = bfunc(); console.log("a2"); b.then((value) => { console.log(value); }); return "a value"; } async function bfunc() { console.log("b1"); await console.log("waiting"); console.log("b2"); return "b value"; } const a = afunc(); a.then((value) => { console.log(value); }); console.log("script end");Y los resultados son:
a1 b1 waiting a2 script end b2 a value b valueEn MDN dice
La expresión await hace que la ejecución de la función asíncrona se detenga hasta que se liquide una Promesa (es decir, se cumpla o se rechace), y reanudar la ejecución de la función asíncrona después del cumplimiento.
¿Cuándo sucede exactamente este 'currículum'? ¿Y tiene algo relacionado con la cola de microtareas en términos de orden de ejecución?
Además, espero que b value aparezca antes a value , ya que parece que b.then() se insertará en la cola de microtareas antes a.then() , y el resultado real me confundió mucho.
¡Cualquier ayuda sería muy apreciada!
Editar : si elimina await en bfunc, el resultado sería como:
a1 b1 waiting b2 a2 script end b value a valueCuando MDN dice resume execution of the async function , significa que esperará a que se complete la función interna y luego continuará ejecutando la función externa.
Por ejemplo:
async function outer() { console.log("outer function start"); await inner(); console.log("outer function end"); } async function inner() { console.log("inner function start"); await new Promise(resolve => setTimeout(() => resolve(), 1000)); console.log("inner function end"); } outer();Registrará:
outer function start inner function start * 1 second pause * inner function end outer function end Creo que la razón por la que está viendo los registros fuera de orden es porque está ejecutando b.then , pero también hay un código fuera de la devolución de llamada asíncrona, por lo que el código posterior no se ejecuta necesariamente en orden.
JavaScript promete trabajo debido a las microtareas, por lo que están relacionadas.
Las promesas de JavaScript y la API de Mutation Observer usan la cola de microtareas para ejecutar sus devoluciones de llamada. - MDN
¡Espero que esto ayude!