El código JavaScript se ejecuta en un solo subproceso, en un bucle de eventos cuando el método empuja a API web devuelve la función de devolución de llamada a la cola, la cola del oyente y la pila de llamadas están vacías. funciones? ¿Por qué?
Debido a que JavaScript es de subproceso único, técnicamente solo es concurrente , no paralelo . Es decir, nunca se ejecutan dos instrucciones al mismo tiempo, pero el ciclo de eventos nos permite coordinar el orden en que se ejecutan las instrucciones de modo que ciertas instrucciones no bloqueen .
Para ver por qué esto es útil, considere la siguiente secuencia de pasos:
El paso 1 podría llevar bastante tiempo, y es posible que queramos hacer otro trabajo mientras esperamos que se complete, convirtiéndolo en una llamada de bloqueo . En un mundo puramente secuencial, esto significa que el paso 2 no se ejecutará hasta que se haya completado el paso 1. En comparación, si hacemos esto asíncrono y, por lo tanto, sin bloqueo , podemos ejecutar los pasos 1 y 2 al mismo tiempo . Esto sucede porque el ciclo de eventos ejecutará primero una iteración de nuestro código síncrono (paso 2), luego ejecutará nuestro código asíncrono (paso 1); está cambiando el orden en que las instrucciones se ejecutan de tal manera que nuestro código no bloquea . Curiosamente, esto significa que se ejecutará un retraso asíncrono de 0 segundos después de la próxima iteración síncrona del código.
Digamos que presentamos el paso 3, en el que necesitamos la respuesta de la llamada a la API en el paso 1. Para hacer esto, podemos usar un async-await , que se bloqueará hasta que se complete el paso 1. Esto no es puramente secuencial, ya que el paso 2 no necesita esperar a que se complete el paso 1, pero en el paso 3 podemos crear un punto síncrono en nuestro código a través de async-await . Por lo tanto, podemos mantener nuestro código sin bloqueo donde sea importante y aún así introducir una secuencia particular de eventos.