Estoy pensando en eso y esto es lo que se me ocurrió:
Digamos que tenemos un código como este:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Entra una solicitud y el motor JS comienza a ejecutar el código anterior paso a paso. Las dos primeras llamadas son llamadas de sincronización. Pero cuando se trata de setTimeout
método, se convierte en una ejecución asíncrona. Pero JS regresa de inmediato y continúa ejecutando, lo que se llama Non-Blocking
o Async
. Y continúa trabajando en otros, etc.
Los resultados de esta ejecución son los siguientes:
acdb
Entonces, básicamente, el segundo setTimeout
se terminó primero y su función de devolución de llamada se ejecuta antes que el primero y eso tiene sentido.
Estamos hablando de la aplicación de un solo subproceso aquí. JS Engine sigue ejecutando esto y, a menos que finalice la primera solicitud, no irá a la segunda. Pero lo bueno es que no esperará setTimeout
a que se resuelvan las operaciones de bloqueo, por lo que será más rápido porque acepta las nuevas solicitudes entrantes.
Pero mis preguntas surgen en torno a los siguientes elementos:
# 1: Si estamos hablando de una aplicación de subproceso único, ¿qué mecanismo procesa setTimeouts
mientras el motor JS acepta más solicitudes y las ejecuta? ¿Cómo continúa el hilo único trabajando en otras solicitudes? Lo que funciona setTimeout
mientras otras solicitudes siguen llegando y se ejecutan.
# 2: Si estas setTimeout
funciones se ejecutan detrás de escena mientras entran y se ejecutan más solicitudes, ¿qué lleva a cabo las ejecuciones asíncronas detrás de escena? ¿Qué es esta cosa de la que hablamos llamada EventLoop
?
# 3: ¿ Pero no se debe poner todo el método EventLoop
para que todo se ejecute y se llame al método de devolución de llamada? Esto es lo que entiendo cuando hablo de las funciones de devolución de llamada:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Pero en este caso, ¿cómo sabe JS Engine si se trata de una función asincrónica para poder poner la devolución de llamada en la EventLoop? Perhaps something like the
palabra clave async` en C # o algún tipo de atributo que indique que el método que JS Engine adoptará es un método asincrónico? y debe ser tratado en consecuencia.
# 4: Pero un artículo dice bastante contrario a lo que estaba adivinando sobre cómo podrían estar funcionando las cosas:
Event Loop es una cola de funciones de devolución de llamada. Cuando se ejecuta una función asíncrona, la función de devolución de llamada se inserta en la cola. El motor de JavaScript no comienza a procesar el bucle de eventos hasta que se ejecuta el código después de que se haya ejecutado una función asíncrona.
# 5: Y aquí está esta imagen que podría ser útil, pero la primera explicación en la imagen dice exactamente lo mismo mencionado en la pregunta número 4:
Entonces, mi pregunta aquí es obtener algunas aclaraciones sobre los elementos enumerados anteriormente.