¿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:
Crear una instancia de
AbortController.Pasar la señal de ese controlador (
controller.signal) a la solicitudfetch.Usar
setTimeoutpara llamar acontroller.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
AbortController: Crea un objeto con una propiedadsignalque se comunica con elfetch, y un métodoabort()que cancela cualquierfetchque esté escuchando esa señal.signalenfetch: Al pasar{ signal: controller.signal }, le dices afetchque debe estar atento a las señales de cancelación.setTimeout: Simplemente actúa como un cronómetro. Cuando se acaba el tiempo, llama acontroller.abort(), lo que hace que la promesa delfetchse rechace inmediatamente con un error de tipoAbortError.
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.
No hay comentarios:
Publicar un comentario