Signatur
Beschreibung
Die Eigenschaft AbortSignal.aborted ist ein schreibgeschützter Wahrheitswert. Er zeigt an, ob die asynchronen Operationen, die an dieses Signal gebunden sind, abgebrochen wurden. Sobald AbortController.prototype.abort() aufgerufen wird, ein Zeitlimit von AbortSignal.timeout() abläuft oder ein Quellsignal von AbortSignal.any() abbricht, wechselt der Wert dauerhaft auf true. Zurücksetzen lässt er sich nicht mehr.
Gebraucht wird aborted vor allem in eigenen abbrechbaren Funktionen. Vor dem Start einer aufwendigen Operation prüft man, ob das Signal schon abgebrochen ist, und zwischen einzelnen Arbeitsschritten fragt man den Wert erneut ab. So lassen sich zum Beispiel lange Schleifen, das seitenweise Laden von Daten oder Wiederholungsversuche kooperativ beenden.
Der Wert zeigt nur den aktuellen Zustand. Um sofort auf einen Abbruch zu reagieren, registriert man zusätzlich einen Listener für das Ereignis abort. Den Grund des Abbruchs liefert AbortSignal.reason. Mit AbortSignal.prototype.throwIfAborted() gibt es außerdem eine Kurzform für das übliche Muster „prüfen und dann werfen“.
Rückgabewert
true, wenn das Signal abgebrochen wurde, sonst false. Der Wert ist schreibgeschützt und wechselt nur einmal, und zwar von false auf true.Beispiele
Zustand vor und nach abort() prüfen
const controller = new AbortController();
const { signal } = controller;
console.log(signal.aborted); // noch nicht abgebrochen
controller.abort();
console.log(signal.aborted); // jetzt abgebrochen
console.log(signal.reason.name);
Lange Schleife kooperativ abbrechen
const verarbeiteDatensaetze = async (datensaetze, signal) => {
const ergebnisse = [];
for (const eintrag of datensaetze) {
// Zwischen den Schritten prüfen, ob abgebrochen wurde
if (signal.aborted) {
console.log(`Abgebrochen nach ${ergebnisse.length} Einträgen`);
return ergebnisse;
}
ergebnisse.push(eintrag * 2);
await new Promise((r) => setTimeout(r, 100));
}
return ergebnisse;
};
const controller = new AbortController();
setTimeout(() => controller.abort(), 350);
const resultat = await verarbeiteDatensaetze([1, 2, 3, 4, 5, 6], controller.signal);
console.log(resultat);
Bereits abgebrochenes Signal vor fetch() abfangen
const ladeBenutzer = async (id, signal) => {
if (signal?.aborted) {
// Keine Netzwerkanfrage starten, wenn schon abgebrochen
throw signal.reason ?? new DOMException('Abgebrochen', 'AbortError');
}
const antwort = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`, { signal });
return antwort.json();
};
const signal = AbortSignal.abort('Benutzer hat die Seite verlassen');
try {
await ladeBenutzer(1, signal);
} catch (fehler) {
console.log('Fehler:', fehler);
}
Zeitlimit mit AbortSignal.timeout() abfragen
const signal = AbortSignal.timeout(200);
console.log('Direkt:', signal.aborted);
setTimeout(() => {
console.log('Nach 300 ms:', signal.aborted);
console.log('Grund:', signal.reason.name);
}, 300);
// Wichtig · Fallstricke
- Nur lesbar: Eine Zuweisung wie
signal.aborted = truehat keine Wirkung. Im Strict Mode wirft sie einenTypeError. Ein Signal bricht man ausschließlich übercontroller.abort()ab. - Kein Zurücksetzen: Ist ein Signal einmal abgebrochen, bleibt es das. Für einen neuen Versuch braucht man einen neuen
AbortController. Wird ein abgebrochenes Signal wiederverwendet, schlägt jedesfetch()damit sofort fehl. - Abfragen reicht nicht immer:
abortedzeigt nur den Zustand zum Zeitpunkt der Abfrage. Wenn gerade einawaitläuft, erfährt man vom Abbruch erst beim nächsten Prüfen. Für eine sofortige Reaktion zusätzlichsignal.addEventListener('abort', …, { once: true })verwenden. - Kürzere Alternative:
signal.throwIfAborted()ersetzt das Musterif (signal.aborted) throw signal.reason;. Die Methode wird in älteren Umgebungen aber nicht unterstützt (vor Chrome 100, Firefox 97, Safari 15.4, Node.js 17.3). - Kompatibilität:
abortedselbst funktioniert in allen modernen Browsern und ab Node.js 15 global. Internet Explorer unterstützt es nicht. Obreasongesetzt ist, hängt von der Laufzeitumgebung ab: Ältere Versionen setzen ihn nicht.