Ir al contenido principal

Manejo de hilos con async y await (Javascript)

 ¿Cuando hago un await fetch se congela la pantalla?

Esa es una de las preguntas más comunes y cruciales cuando se empieza a trabajar con JavaScript moderno.

La respuesta corta es: No, la pantalla no se congela (o al menos, no debería).

El uso de await fetch es precisamente la forma correcta de hacer peticiones de red sin bloquear el hilo principal de ejecución (conocido como Main Thread) que es responsable de actualizar la interfaz de usuario (UI).

Aquí tienes la explicación detallada de por qué esto funciona y cómo afecta a tu aplicación:


1. El Hilo Principal y el Bloqueo

En los navegadores (y en Node.js), JavaScript usa un modelo de hilo único (Single-Threaded) para ejecutar el código.

  • ¿Qué hace el hilo principal? Se encarga de todo lo visual: dibujar píxeles, procesar clics, manejar scrolls y ejecutar tu código JavaScript.

  • ¿Qué pasa si lo bloqueas? Si ejecutas una operación larga y síncrona (como un bucle infinito o una función pesada sin pausas), el hilo principal se detiene. Como no puede actualizar la pantalla ni responder a eventos, la interfaz se congela, y el navegador puede mostrar el temido mensaje de "La página no responde".

2. Cómo fetch y await Evitan el Bloqueo

Tanto fetch como async/await están construidos sobre el sistema de Promises de JavaScript, que es inherentemente asíncrono.

A. La Función fetch() (El inicio asíncrono)

  1. Cuando llamas a fetch(url), JavaScript le dice al navegador: "Por favor, inicia esta petición de red, avísame cuando esté lista".

  2. Inmediatamente, la ejecución de la función actual continúa (no espera). La petición de red se ejecuta en segundo plano, fuera del control del hilo de JavaScript.

  3. fetch devuelve una Promise que está en estado "pendiente" (pending).

B. La Palabra Clave await (La pausa sin congelar)

  1. Cuando usas await delante de una Promise (como await fetch(...)), le dices a JavaScript: "Espera a que esta Promise se resuelva o se rechace."

  2. Sin embargo, esta espera no es un bloqueo. En lugar de detener el hilo, await pausa la ejecución de la función async que lo contiene y devuelve el control al hilo principal.

  3. El hilo principal queda libre para hacer su trabajo esencial: actualizar la UI, responder a clics, y ejecutar otras tareas en la cola de eventos.

El Flujo:

  1. Se llama a async function miFuncion() { ... await fetch(...) ... }.

  2. fetch inicia la petición.

  3. await pausa miFuncion() y libera el hilo principal.

  4. La pantalla sigue siendo interactiva.

  5. Cuando la petición de red termina (llegan los datos), la Promise de fetch se resuelve.

  6. JavaScript retoma la ejecución de miFuncion() justo después del await con los datos listos.

Conclusión

El patrón async/await con fetch es la mejor práctica para operaciones de E/S (Entrada/Salida) en la web porque garantiza que, mientras se espera la respuesta de la red, la interfaz de usuario permanece fluida y receptiva.

Comentarios

Entradas populares de este blog

Crear proyecto de frontend con Vite, React, Tailwind, Typescript y JSX

 ¿Cómo se crea un proyecto exclusivo de frontend con Vite, React, Tailwind, Typescript y JSX? ¡Absolutamente! Entiendo que quieres la guía completa para pasar de cero a tener un proyecto de frontend moderno, vacío y listo para ser llenado con tu código. A continuación, te proporciono un archivo de guía detallada que incluye todos los comandos necesarios para inicializar el proyecto, configurar Tailwind CSS, y los pasos clave para empezar a "poblarlo". Voy a generar un documento Markdown con la guía paso a paso, incluyendo los comandos de terminal y las modificaciones esenciales a los archivos de configuración. Guía: Creación de un Proyecto Frontend Puro (Vite, React, TypeScript, Tailwind) Este documento detalla el proceso para inicializar un proyecto de frontend vacío y optimizado, utilizando Vite como empaquetador, React como librería, TypeScript para tipado y Tailwind CSS para estilizado. 1. Inicialización del Proyecto con Vite Vite es la herramienta más rápida para emp...

Tokens V2

Tokens: Programme to discover tokens, where there are not. Now available at  https://puszcza.gnu.org.ua/projects/tokens/ This is Version 2, for  version 1, go here . Synopsis: use TokensV2; sub printFile; my @FORMAT = ( ['<Message Date=".*?" Time=".*?" DateTime=".*?" SessionID=".*?"><From>(?:<User FriendlyName=".*?"/>)+</From><To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style=".*?")?>.*?</Text></Message>',   sub {     my $fh = $_[1];     my ($d, $t, $f, $s, $T) = $_[0] =~ m|<Message Date="(.*?)" Time="(.*?)" DateTime=".*?" SessionID=".*?">(<From>(?:<User FriendlyName=".*?"/>)+</From>)<To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style="(.*?)")?>(.*?)</Text></Message>|;     my $F = join '<br />', ...

Perl Net::LDAP::SimpleServer

Adaptaciones sobre el módulo LDAP Server para Windows (Strawberry Perl) Lista de adaptaciones (continúa más abajo): - Relajación de condiciones de bind:     - Cuenta principal (principal account)     - Validación de contraseñas Ubicación del archivo: %Strawberry_Perl%\site\lib\net\ldap\SimpleServer\ProtocolHandler.pm CPAN: http://search.cpan.org/~russoz/Net-LDAP-SimpleServer-0.0.17/lib/Net/LDAP/SimpleServer.pm Código: package Net::LDAP::SimpleServer::ProtocolHandler; use strict; use warnings; # ABSTRACT: LDAP protocol handler used with Net::LDAP::SimpleServer our $VERSION = '0.0.17';    # VERSION use Net::LDAP::Server; use base 'Net::LDAP::Server'; use fields qw(store root_dn root_pw allow_anon); use Carp; use Net::LDAP::LDIF; use Net::LDAP::Util qw{canonical_dn}; use Net::LDAP::FilterMatch; use Net::LDAP::Constant (     qw/LDAP_SUCCESS LDAP_AUTH_UNKNOWN LDAP_INVALID_CREDENTIALS/,   ...