Dando el código al instante:
setTimeout(() => console.log("next macro")); /// next macro Promise.resolve().then(() => gen.next()) /// microtask inside, #2 const gen = (function*(){ console.log("Hello"); yield; /// #3 console.log("World"); })(); gen.next(); console.log("main script has been ended"); /// #1Como saben, los generadores se pueden suspender. Entonces, más adelante podemos volver a la función de generador cuando algún código invoque cierto código relacionado con el generador.
Este código tiene 2 macrotareas y 1 microtarea. Usted sabe que eventloop no ejecutará microtareas hasta que la macrotarea no haya terminado. Ya que cuando la macrotarea habrá terminado #1, entonces la microtarea estará activa #2 y exactamente el código dentro de esta microtarea nos devuelve a la función generadora #3, y habremos ejecutado console.log("World").
Entonces mi pregunta es: ¿por cuál es el código que ejecuta el código del generador, reanuda y restaura el contexto de ejecución del generador? ¿Es una tarea macro o micro dentro del bucle de eventos cuando lo invocamos dentro de una tarea micro? ¿El contexto de ejecución restaurado del generador es una microtarea, cuando lo estamos ejecutando?
PD Es posible que no entienda porque no sé cómo expresar mi pensamiento correctamente.
¿Por cuál es el código que ejecuta el código del generador, reanuda y restaura el contexto de ejecución del generador? ¿Es una tarea macro o micro dentro del bucle de eventos cuando lo invocamos dentro de una tarea micro?
Se ejecuta cada vez que se llama a next() en el generador. Si esa llamada ocurre como parte de una tarea de macro, sigue siendo parte de esa tarea de macro. Si esa llamada ocurre como parte de una microtarea, sigue siendo parte de esa microtarea. De hecho, la pila de llamadas aumentó al reanudar el código del generador y vuelve al código que lo reanudó (como con next() ).
Dado que en su ejemplo llama a next() tanto en el código síncrono como en then devolución de llamada, primero se ejecuta como parte de la macro tarea y luego como parte de una micro tarea. En ese sentido, no es diferente a hacer una llamada de función.