Timeout y combinación de AbortSignal
Los runtimes modernos incluyen AbortSignal.timeout() y AbortSignal.any(). La primera señal que se aborta determina el estado y el reason de la señal combinada.
const controller = new AbortController()const timeoutSignal = AbortSignal.timeout(8_000)const signal = AbortSignal.any([controller.signal, timeoutSignal])
try { const response = await fetch("/api/reporte", { signal }) if (!response.ok) throw new Error(`HTTP ${response.status}`)} catch (error) { if (!signal.aborted) throw error
if (signal.reason?.name === "TimeoutError") { console.log("La petición superó el tiempo máximo") } else if (signal.reason?.name === "AbortError") { console.log("La persona canceló la petición") } else { console.log("Petición detenida", signal.reason) }}
// Cancelación explícita, por ejemplo al cerrar un modal:controller.abort(new DOMException("Modal cerrado", "AbortError"))No compruebes únicamente el error capturado: inspecciona signal.aborted y signal.reason para diferenciar timeout, navegación y acción manual. La operación también puede fallar por red o HTTP sin que la señal se haya abortado.
Si el runtime no soporta estas funciones, crea un AbortController, programa un timer y límpialo en finally. La señal comunica cancelación; no garantiza que un servidor remoto detenga trabajo que ya comenzó.