Cancela peticiones obsoletas

Usa un controlador por búsqueda y comprueba que siga siendo la petición más reciente. Cancelar ahorra trabajo cuando el transporte lo admite; comprobar la identidad también evita que resultados obsoletos actualicen la interfaz.

import { Http, rest } from "fetchzen";
interface SearchItem {
id: string;
title: string;
}
export function createSearch(
render: (items: SearchItem[]) => void,
reportError: (error: unknown) => void,
) {
const api = Http.create("https://api.example.com", {
preset: rest,
cache: false,
});
let active: AbortController | undefined;
async function search(query: string): Promise<void> {
active?.abort();
const controller = new AbortController();
active = controller;
try {
const { data } = await api.get<SearchItem[], { q: string }>("/search", {
params: { q: query },
signal: controller.signal,
timeout: 5_000,
});
if (active === controller && !controller.signal.aborted) {
render(data);
}
} catch (error) {
if (active !== controller || controller.signal.aborted) return;
reportError(error);
} finally {
if (active === controller) active = undefined;
}
}
function dispose(): void {
active?.abort();
active = undefined;
}
return { search, dispose };
}

Llama a search(query) cuando cambie el campo de búsqueda y a dispose() cuando se quite la vista. Una señal cancelada no se puede reutilizar, por eso cada búsqueda recibe un controlador nuevo.

signal y un timeout positivo se combinan: cualquiera puede cancelar el fetch. No hay tiempo límite de forma predeterminada; timeout: 0 desactiva un límite heredado. Un abort() normal produce AbortError, mientras que el tiempo límite de la biblioteca usa TimeoutError. Este ejemplo ignora las peticiones reemplazadas o canceladas al quitar la vista, pero reporta los tiempos de espera agotados y otros fallos de la petición actual.

Un fetch inyectado debe respetar init.signal por su cuenta. Cancelar no garantiza que el servidor haya dejado de procesar la petición.

Consulta también: pruebas con fetch inyectado. Prueba tiempo límite y cancelación.