JavaScript es un lenguaje peculiar, su particularidad en el manejo de procesos asíncronos para poder delegar tareas y continuar con su ejecución principal, véase por ejemplo una request a una API en la cual mientras esta se completa el sitio web continua cargando, y ya para cuando la petición finalice mostrar el contenido en pantalla, nos presenta un flujo de ejecución a lo que no muchos cuando empezamos en programación estamos acostumbrados.
En una charla de Ryan Dahl hace muchos años cuando este se encontraba presentado a Node.js y como este funciona, dio unos ejemplos para iluminarnos un poco.
normalmente en un código de programación estructurada se nos presenta la siguiente situación:
print("Enter your name")read(name)
Es un código con el cual deben estar muchos familiarizados en nuestros primeros pasos, un mensaje en consola para ingresar nuestro nombre, pero, y que mas hace el programa mientras nosotros no lo ingresamos ? la respuesta es NADA.
Ryan Dahl, suponía esto como un problema, ya que según el, todo proceso de E/S no debería de ser bloqueante para el programa, si queremos trasladar esto a un ambiente web pudiéramos ver el siguiente caso:
const query = 'SELECT * FROM ......'// otros procesos
Supongamos que esta query es como un mensajero, el cual debe tomar nuestro pedido, ir a algún lugar del mundo, esperar a que procesen la solicitud, recoger nuestro paquete, y volver en cuestión de mili segundos, y mientras todo esto ocurre sin que nos demos cuenta, nuestro sitio web esta allí, expectante a que algo ocurra y poder seguir cargando.
Pero, y como solucionamos esto? ahí es donde JavaScript hace su magia.
Tenemos que tener clara una cosa, JavaScript solo funciona con un único hilo, es decir solo puede hacer un proceso a la vez, por lo cual debemos evitar en la medida de lo posible bloquear si flujo de ejecución, pero, y si no somos nosotros quienes controlamos cuanto va a durar un proceso como una query, que hacemos? JavaScript se va a encargar de avisarnos cuando el proceso este listo! valiéndose de eventos, así como hacíamos para manejar el click de un botón. Nosotros estamos acostumbrados a pensar de esta manera
var a = b('SELECT * FROM ....');
//otros procesos
“a” es el valor de un función “b” que al completarse retorno el resultado. PERO en asincronia debemos replantear a la siguiente forma:
a("SELECT * FROM...", function(b){
. . .
})
//otros procesos
“a” es una función, la cual tras completarse mandara el resultado “b” a la función que pasamos por parámetro, también conocida como callback
Así de esta manera, tenemos una vía para que esa query que realizamos a un servidor al otro lado del mundo nos pueda notificar que nuestro pedido esta listo, sin que nuestro sitio se vea interrumpido.
Por supuesto el tema no acaba aquí, los callback por si mismos son solo una manera para atacar este problema, mas adelante surgieron soluciones mas elegantes como las promesas, o async / await, siendo este ultimo un modelo que se asemeja mas al modelo a = b().
Ponle ganas a este tema y tu travesía por este lenguaje sera mas amena, y recuerda que siempre en software todo tiene un propósito único, solucionar un problema, y jamas dejes de curiosear como fue que lo resolvieron.
Éxitos en el curso de fundamentos de JavaScript !
Esto que mencionas en tu articulo, es el event loop. Dejo un link para aportar
https://medium.com/@ubykuo/event-loop-la-naturaleza-asincrónica-de-javascript-78d0a9a3e03d