He estado estudiando funciones de promesas, espera y asíncronas. Mientras estaba en la etapa de aprender promesas, me topé con esto:
async function async1(){ console.log('Async 1'); await async2(); // * console.log('AFter Async 1'); } async function async2(){ console.log('FROM async 2'); } async1(); console.log('Synchronous'); //**Lo que resulta en:
Async 1 FROM async 2 Synchronous AFter Async 1¿Cómo salta el código de * a **? ¿Cómo se usa la microtarea aquí?
No hay microtarea involucrada en la ejecución de la secuencia específica sobre la que preguntó (de * a ** ), aunque una microtarea se pone en cola durante esa secuencia (luego se ejecuta más tarde).
Una función async es síncrona hasta la primera await , excepción no detectada o return (incluido un retorno implícito donde la ejecución del código simplemente "cae" al final de la función). En ese punto, la función devuelve una promesa y la ejecución síncrona continúa desde el punto en el que se llamó a la función. Si fue una excepción, una return o una devolución implícita (no una await ), se pone en cola una microtarea para liquidar la promesa de la función (rechazándola en caso de excepción o cumpliéndola en caso de devolución).
He resaltado las partes sincrónicas de ese código en amarillo:
En su ejemplo, cuando llama a async1 en la parte inferior, se ejecuta su parte sincrónica (registrando Async 1 y luego llamando a async2 , que registra FROM async 2 durante su parte sincrónica); habiendo ejecutado async2 y obtenido una promesa de él, async1 alcanza la await y devuelve su propia promesa; luego, la ejecución sincrónica continúa justo después de que la llamó, registrando Synchronous .
En este ejemplo particular, entre las partes * y ** , se pone en cola una microtarea para el cumplimiento de la promesa de async2 . Cuando finaliza la tarea que ejecuta el código síncrono en su ejemplo, esa microtarea se toma de la cola de microtareas y se ejecuta, y eso resuelve la promesa de async1 que la estaba esperando; El código de async1 continúa, hace su registro y luego regresa implícitamente, por lo que una microtarea se pone en cola para procesar esa liquidación (cumplimiento en este caso) y se recoge de la cola de microtareas una vez que la microtarea async2 de ejecutarse. Pero nada está esperando esa promesa, por lo que el acuerdo no tiene ningún efecto aparente.