Entonces, ABC está ganando en este momento. De acuerdo, entonces... Costo del ciclo de vida de node.js. De acuerdo. Eso es cierto. Creo que sí, la persona que adivinó ACB tiene razón. Echemos un vistazo. ACB. Entonces, en primer lugar, el orden es el mismo. Nuevamente, debes pensar en esto como, hay un solo hilo y hay una cola de instrucciones. Y la cola de instrucciones es la misma con la única diferencia de que antes de imprimir C hemos esperado dos segundos. Pero todo lo demás es igual, ¿verdad? Entonces, el orden de los bloqueos también debe ser el mismo.
Lo interesante aquí es que estamos esperando dos segundos entre A y C y luego B se imprime justo después, casi instantáneamente. Entonces, lo que vemos aquí es que no hay un segundo adicional de retraso después de esperar dos segundos. Esto es lo que hace setTimeOut, me permite describir un retraso que comienza desde la última instrucción ejecutada, bueno, la última instrucción encolada. Entonces, dado que esperamos dos segundos, dos segundos son más que uno. Imprime b instantáneamente, no necesita esperar más. De acuerdo. Genial, ahora pasemos al tercer ejemplo. Y aquí no vamos a bloquear el hilo ni nada por el estilo, pero estableceremos el tiempo de espera en cero milisegundos. Entonces, en tu opinión, ¿esto cambiará algo? ¿Se verá afectado el orden? O sí, haz tus apuestas, supongo.
De acuerdo, ACB no cambiará, sigue siendo el mismo. ACB también. Sí, tienes razón, básicamente no cambiará. ACB de nuevo, sí. Así que ya entiendes cómo funciona esta cola. Estoy contento por eso. Entonces, ACB, el orden es el mismo, el hecho de que no estemos esperando ningún milisegundo en absoluto no cambia el hecho de que esto está encolando el registro primero, esto está encolando la llamada de setTimeOut, y esto está encolando el registro C. Y luego, cuando se llama a esto, se encola en la última posición, y luego, sí, entonces la pila, en este momento, tiene A, ahora la pila tiene A, y el setTimeOut, estoy improvisando aquí, y luego aquí, la pila tiene setTimeout, y luego C, y luego cuando esto se ejecuta, como, el motor comienza, en realidad, a tomar instrucciones y ejecutarlas, tomará A, y la pila tiene setTimeout, y C, luego toma el setTimeout, y lo ejecuta. Y la pila tiene C, y como resultado, la pila ahora tiene C y B, porque la ejecución de setTimeout encola esta llamada aquí. Y luego, finalmente, se toma C, B aún está pendiente de ejecución, y luego se toma B, la pila está vacía, y el programa termina. Oh, de acuerdo, espero que esto haya sido improvisado. No tenía planeado explicarlo de esta manera, pero espero que tenga sentido. De todos modos. Uh, genial. Sí, de nuevo, lo mismo, solo, ya sabes, estamos jugando con el hecho de que solo hay un hilo, y hay una cola de instrucciones que se ejecutarán, y setTimeout es realmente, ya sabes, tiene este nombre muy engañoso de tiempo de espera cuando en realidad, está encolando cosas con un desencadenante basado en el tiempo, o no sé. El modelo mental que sigo, la forma en que pienso sobre el comportamiento asíncrono en JavaScript en general, tiene más que ver con encolar cosas como hicimos aquí, y entender cuál será el desencadenante. En el caso de un setTimeout, va a encolar como sucedió aquí. Va a encolar B, pero es B con un asterisco porque no es como si el intérprete no sacara B de la pila si no ha pasado suficiente tiempo porque tal vez necesito esperar dos segundos. Si no ha pasado suficiente tiempo, B se quedará en la pila hasta que haya transcurrido ese tiempo y luego se ejecutará una vez que haya pasado ese tiempo. Y esto es exactamente lo mismo cuando hablamos de una llamada AJAX en la noche, por ejemplo, no es un desencadenante basado en el tiempo. Es un desencadenante que se basa en alguna operación de entrada y salida que ocurre en la capa de red cuando se realiza alguna solicitud a algún servidor y luego el sistema operativo recibe la respuesta y la analiza, blah, blah, blah. Y luego el desencadenante es como mi devolución de llamada para la llamada AJAX va a ser que tengo la respuesta y la respuesta debe ser analizada y luego se llama a la devolución de llamada. Y hasta que esa respuesta esté disponible, la devolución de llamada estará en la cola esperando ser ejecutada. O por ejemplo, si estoy escribiendo un archivo en el sistema de archivos, el desencadenante será que esa operación de escritura se complete. Y luego, el modelo mental, todo es lo mismo. Son solo devoluciones de llamada que están encoladas. Están en la cola esperando ser ejecutadas y se ejecutarán según algún desencadenante y dependiendo de si las encolamos con un setTimeOut o una llamada AJAX o una escritura de archivo. Sí, esos son diferentes desencadenantes que se tendrán en cuenta cuando esa devolución de llamada sea lo próximo en ejecutarse, ¿verdad? Así es como pienso en estas cosas.
Comments