es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué es la ejecución suspendida del contexto en el modelo del bucle de eventos?

Dando el código instantáneamente:

setTimeout(() => console.log("next macro")); /// siguiente macro 
Promise.resolve().then(() => gen.next()) /// microtarea interior, #2
const gen = (function*(){
    console.log("Hola");
    yield; /// #3
    console.log("Mundo");
})();
gen.next();
console.log("el script principal ha terminado"); /// #1

Como sabes, los generadores pueden suspenderse. Más tarde, podemos volver a la función de generador cuando algún código invoque cierto código que esté relacionado con el generador.

Este código tiene 2 macrotareas y 1 microtarea. Sabes que el bucle de eventos no ejecutará las microtareas hasta que la macrotarea no haya terminado. Cuando la macrotarea haya terminado en #1, la microtarea estará activa en #2 y exactamente el código dentro de esta microtarea nos devolverá a la función de generador en #3, y se ejecutará console.log("Mundo").

Entonces mi pregunta es: ¿por qué el código que ejecuta el código del generador se reanuda y restaura el contexto de ejecución del generador? ¿Es una macrotarea o una microtarea dentro del bucle de eventos cuando lo invocamos dentro de una microtarea? ¿El contexto de ejecución restaurado del generador es una microtarea cuando lo estamos ejecutando?

P.D. Puede que no me entiendas porque no sé cómo expresar adecuadamente mi pensamiento.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El código que ejecuta y reanuda el contexto de ejecución del generador es una microtarea dentro del bucle de eventos. Cuando lo invocamos dentro de una microtarea, el contexto de ejecución restaurado del generador también es una microtarea. Esto se debe a que las microtareas se ejecutan antes de la siguiente macrotarea, lo que permite la reanudación del código ejecutado dentro de la función generadora.

Comments are closed.