fetch() abbrechen und mit Timeout absichern – AbortController
Ein fetch(), das ewig lädt, oder eine veraltete Suchanfrage – mit AbortController brichst du laufende Requests sauber ab und gibst ihnen ein Zeitlimit.
fetch() läuft von sich aus unbegrenzt weiter – hängt der Server, hängt deine Anfrage. Und tippt jemand im Suchfeld weiter, willst du die alte, schon veraltete Anfrage abbrechen. Beides löst der AbortController.
fetch mit Timeout
Am einfachsten geht das über AbortSignal.timeout():
try {
const res = await fetch('/api/daten', {
signal: AbortSignal.timeout(5000), // nach 5 s abbrechen
});
const daten = await res.json();
} catch (err) {
if (err.name === 'TimeoutError') console.warn('Zeitüberschreitung');
else if (err.name === 'AbortError') console.warn('Abgebrochen');
else throw err;
}Veraltete Anfragen abbrechen (Live-Suche)
Bei jeder neuen Eingabe brichst du den vorigen Request ab, damit dir kein altes Ergebnis dazwischenfunkt:
let controller;
async function suche(q) {
controller?.abort(); // vorherige Anfrage stoppen
controller = new AbortController();
try {
const res = await fetch(`/api/suche?q=${encodeURIComponent(q)}`, {
signal: controller.signal,
});
return await res.json();
} catch (err) {
if (err.name === 'AbortError') return null; // gewollt abgebrochen
throw err;
}
}Wichtig ist, den AbortError gezielt abzufangen – ein Abbruch ist ja kein echter Fehler, sondern genau das gewünschte Verhalten. Alle anderen Fehler reichst du normal weiter.
Solche Details entscheiden, ob sich eine Oberfläche schnell und robust anfühlt. Wenn du so eine Website brauchst, melde dich über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
toSorted, toReversed und with: Arrays sortieren, ohne das Original zu zerstören
array.sort() sortiert nicht eine Kopie, sondern das Array selbst – und genau daran ist schon mancher Zustand im Frontend stillschweigend kaputtgegangen. Seit ES2023 gibt es zu jeder dieser Methoden eine Variante, die eine Kopie zurückgibt.
Aufzählungen richtig verketten mit Intl.ListFormat
"a, b und c" von Hand zusammenzubauen geht fast immer schief – bei einem Element, bei zwei Elementen, beim letzten Komma. Intl.ListFormat macht es richtig, in jeder Sprache, ganz ohne Bibliothek.
requestAnimationFrame – die Animationsschleife, die zum Bildschirm passt
setInterval(schritt, 16) läuft auf einem 144-Hz-Monitor anders als auf einem alten Handy – und im Hintergrundtab einfach weiter. requestAnimationFrame löst beides, wenn man die verstrichene Zeit mitrechnet statt Bilder zu zählen.