Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

164
Vistas
¿Cómo es que el ciclo de eventos nunca se bloquea pero los mensajes en la cola se ejecutan hasta completarse?

Estaba aprendiendo sobre el bucle de eventos de JavaScript en el documento de MDN . Mencionó que un mensaje en la cola se ejecuta hasta el final, pero al final, dijo que el bucle de eventos nunca se bloquea. Realmente no entiendo esto. ¿No es esto una contradicción? Por favor, ayúdame a entender la diferencia entre ellos.

"Ejecutar hasta completar"

Cada mensaje se procesa completamente antes de que se procese cualquier otro mensaje. Esto ofrece algunas buenas propiedades al razonar sobre su programa, incluido el hecho de que cada vez que se ejecuta una función, no se puede adelantar y se ejecutará por completo antes de que se ejecute cualquier otro código (y puede modificar los datos que manipula la función). Esto difiere de C, por ejemplo, donde si una función se ejecuta en un subproceso, el sistema de tiempo de ejecución puede detenerla en cualquier momento para ejecutar algún otro código en otro subproceso.

Una desventaja de este modelo es que si un mensaje tarda demasiado en completarse, la aplicación web no puede procesar las interacciones del usuario, como hacer clic o desplazarse. El navegador mitiga esto con el cuadro de diálogo "un script está tardando demasiado en ejecutarse". Una buena práctica a seguir es acortar el procesamiento de mensajes y, si es posible, dividir un mensaje en varios mensajes.

nunca bloquear

Una propiedad muy interesante del modelo de bucle de eventos es que JavaScript, a diferencia de muchos otros lenguajes, nunca se bloquea. El manejo de E/S generalmente se realiza a través de eventos y devoluciones de llamada, por lo que cuando la aplicación está esperando que regrese una consulta de IndexedDB o que regrese una solicitud de XHR, aún puede procesar otras cosas, como la entrada del usuario.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Tienes razón, las dos citas se contradicen.

En el bucle de eventos, todos los mensajes se ejecutan hasta el final, como está escrito en el primer texto, por lo tanto , bloquean el bucle de eventos mientras se ejecutan.

Esta es la razón por la que timer2 no se ejecutará antes de que finalice el bucle en timer1 en este ejemplo:

 console.log('start'); setTimeout(() => { const startTime = Date.now() while(Date.now() - startTime < 3000); console.log('timer1 end'); }, 0) setTimeout(() => console.log('timer2'), 0); /* start -- three seconds later -- timer1 end timer2 */

Se supone que el texto que dice "nunca bloquea" significa que, a diferencia de muchos idiomas, la mayoría de las API que tardan mucho (o sondean algo lento) están diseñadas para no bloquear el bucle de eventos durante mucho tiempo ; la tarea en un subproceso en segundo plano sin bloquear JavaScript y devolver los resultados a JS cuando estén listos.

Una descripción mucho más precisa de esto sería que "aunque el bucle de eventos puede bloquearse mediante un código de ejecución prolongada, la mayoría de las API de JS están diseñadas para evitarlo".

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda