IIC2513-2018-2 / syllabus

Material y coordinación del curso
10 stars 4 forks source link

Call Stack, Event Loop #17

Closed javierlopeza closed 6 years ago

javierlopeza commented 6 years ago

Respecto a este ejemplo:

setTimeout(() => {
  console.log("Timeout!");
}, 0);

// <--- aquí --->

console.log("Hello!");

Si donde dice <--- aquí ---> existe código que toma mucho tiempo antes de llegar a imprimir Hello! (digamos un for o while muy largo), y tomando el Timeout que demora prácticamente nada, ¿puede pasar que se imprima Timeout! antes que Hello!? En el caso que estoy pensando el callback del Timeout se agregará al Event Queue en algún momento durante el <--- aquí ---> y si justo antes de imprimir Hello! el Event Loop mira el Call Stack estará vacío y pienso que podría agregar al Call Stack el callback que imprime Timeout!, lo que se ejecutaría antes de imprimir Hello!.

Traté de probar con un for largo para simular esto, pero aún así se imprime primero Hello y después Timeout!. No sé si hay algo malo en mi razonamiento arriba o sí está pasando algo especial.

raulmt commented 6 years ago

el callback (que contiene ese console.log("Timeout!)) es agregado inmediatamente a la callback queue. Sin embargo, recuerda que el proceso sólo irá a mirar si hay algo en la cola una vez que el stack de ejecución se vacía. Y tanto la llamada a setTimeout como el siguiente console.log("Hello!") están dentro del mismo elemento del stack de ejecución (el "main" si es que es sólo esto lo ejecutado). Entonces la cola no se irá a mirar hasta después que se ejecuta el último console.log.