Ir al contenido principal

Javascript fetch con timeout

 ¿Al fetch de Javascript se le puede establecer un timeout?

¡Absolutamente! El fetch de JavaScript, por sí solo, no tiene una opción de timeout directa en su objeto de configuración (options). Sin embargo, existe una herramienta moderna y diseñada exactamente para este propósito: el AbortController.

El AbortController te permite controlar y cancelar solicitudes fetch externas, incluido el establecimiento de un límite de tiempo (timeout).

Aquí te explico cómo implementarlo y te doy un ejemplo práctico en JavaScript.


Implementación con AbortController y setTimeout

La técnica consiste en lo siguiente:

  1. Crear una instancia de AbortController.

  2. Pasar la señal de ese controlador (controller.signal) a la solicitud fetch.

  3. Usar setTimeout para llamar a controller.abort() después del tiempo deseado.

Si el fetch termina antes de que expire el setTimeout, limpiamos el timer. Si el setTimeout expira primero, el fetch se cancela y lanza un error.

Código de Ejemplo

Resumen del Funcionamiento

  1. AbortController: Crea un objeto con una propiedad signal que se comunica con el fetch, y un método abort() que cancela cualquier fetch que esté escuchando esa señal.

  2. signal en fetch: Al pasar { signal: controller.signal }, le dices a fetch que debe estar atento a las señales de cancelación.

  3. setTimeout: Simplemente actúa como un cronómetro. Cuando se acaba el tiempo, llama a controller.abort(), lo que hace que la promesa del fetch se rechace inmediatamente con un error de tipo AbortError.

Esta es la manera moderna y oficial de manejar los timeouts en JavaScript.


The AbortController is a global JavaScript class introduced as part of the DOM specification, providing a standardized way to cancel asynchronous tasks like fetch requests, event listeners, timeouts, intervals, and streams. It works by creating an AbortController instance, which has an abort() method and a signal property. The signal can be passed to APIs such as fetch() or addEventListener() to allow cancellation when abort() is called. When abort() is invoked, the associated task is canceled, and the promise from the operation rejects with an AbortError.

This mechanism is particularly useful for improving user experience and network efficiency. For example, in a search input field, debouncing can be implemented using AbortController to abort previous API requests when the user types a new character, ensuring only the latest request completes. Similarly, AbortController can manage multiple event listeners; calling abort() removes all listeners associated with the signal, simplifying cleanup, especially in frameworks like React where cleanup functions are used. It also supports advanced patterns like AbortSignal.timeout() for automatic request timeouts and AbortSignal.any() to combine multiple abort signals into one.

The AbortController API is widely supported in modern browsers, including Chrome, Firefox, Safari, and Edge, though older versions may require a polyfill like abortcontroller-polyfill for compatibility. Its versatility extends beyond fetch requests, allowing developers to make custom logic abortable by listening for the abort event on the AbortSignal. This enables better control over long-running operations, prevents memory leaks, and enhances application responsiveness by gracefully handling canceled tasks.

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/,   ...