NodeJS, la vida de los procesos.
Tags: javascript, node, spanish
Published: 2020-08-02 16:11:20

Desde hace poco he comenzado a estudiar node, y a veces mientras hacia pruebas con el fetch api, el código no seguía el orden que en mi cabeza debía seguir. Además de dejarme con algo de insomnio comencé a leer a qué se debía.

Veamos, si ves el siguiente código:
```javascript
console.log('program start');
setTimeout(function() { console.log('first function') }, 3000);
setTimeout(function() { console.log('second function'); }, 2000);
setTimeout(function() { console.log('third function'); }, 1000);
console.log('program end');
```
Y, si no sabes como funciona el setTimeout() podrías suponer un recorrido línea por línea, y esperar una salida por consola como esta:
```javascript
// program start
// first function
// second function
// third function
// program end
```
claro, si te digo que el setTimeout() le pone un temporizador a una función (setTimeout(\<función\>,\<tiempo en milisegundos\>), es decir ejecuta la función después de determinados milisegundos), entonces quizá pienses que obtendrás algo como esto:
 ```javascript
// program start
// third function
// second function
// first function
// program end
```
Pues te vas a quedar sentado, pues la salida por consola es:
```javascript
// program start
// program end   <--- Ojo, ojito, ojete
// third function
// second function
// first function
```
![pikachu](https://i.imgur.com/wJU1oC5.jpg)
Pero cómo? resulta que javascript hace lo siguiente:
```javascript
console.log('program start');
```
esto lo toma y lo ejecuta, es decir te muestra por consola el mensaje, y pasa a la siguiente línea de código.
```javascript
setTimeout(function() { console.log('first function') }, 3000);
```
acá se detiene y ve una función, la que podría o no demorarse, entonces la deja en una cola, para que se vaya ejecutando en segundo plano, y pasa a la siguiente línea de código.
```javascript
setTimeout(function() { console.log('second function'); }, 2000);
```
acá vuelve a encontrarse con otra función y hace lo mismo, a la cola que tengo prisa, y sigue con la siguiente línea
```javascript
setTimeout(function() { console.log('third function'); }, 1000);
```
se repite el proceso y pasa de la función y continua
```javascript
console.log('program end');
```
acá encuentra algo que puede hacer e imprime por consola el mensaje, y encuentra el final del archivo.

Mientras hacía todo esto, las funciones en cola siguieron ejecutándose y si llegaban a su final, pasaban a su vez a otra cola, de salida digamos.

Javascript revisa la cola de salida y nos muestra los resultados de las funciones que se ejecutaron, todo en orden, revisa luego si queda algo en la cola donde se encontraban las funciones y si no queda nada, pasa a revisar nuevamente la cola de salida, si no encuentra nada pues termina su trabajo.

Todo esto es por optimizar el tiempo de ejecución, pues si esperara hasta que cada función se ejecute para seguir a la siguiente, como el ejemplo, se demoraría en total 6 segundos, versus los 3 segundos que realmente se demora.

Esto toma relevancia al usar funciones promesa, que no se tiene certeza de cuanto demorará en llegar la respuesta.




Eso, bueno no soy experto así que si algo está mal o quieres acotar algo, pues tienes los comentarios y gustoso modifico.


Más información acá la encuentras
- [setTimeout()](https://developer.mozilla.org/es/docs/Web/API/WindowTimers/setTimeout)