Start · Sprachen · JavaScript · Referenz · AbortSignal.aborted

AbortSignal.aborted

Eigenschaft

Die schreibgeschützte Eigenschaft <code>aborted</code> gibt an, ob das zugehörige Signal bereits abgebrochen wurde (<code>true</code>) oder nicht (<code>false</code>).

seit JavaScript Baseline: alle modernen Browser (seit 2019), Node. Kategorie: webapi

Signatur

AbortSignal.aborted

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

Typ
boolean
Beschreibung
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);
false true AbortError

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);
Abgebrochen nach 4 Einträgen [ 2, 4, 6, 8 ]

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);
}
Fehler: Benutzer hat die Seite verlassen

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);
Direkt: false Nach 300 ms: true Grund: TimeoutError

// Wichtig · Fallstricke

  • Nur lesbar: Eine Zuweisung wie signal.aborted = true hat keine Wirkung. Im Strict Mode wirft sie einen TypeError. Ein Signal bricht man ausschließlich über controller.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 jedes fetch() damit sofort fehl.
  • Abfragen reicht nicht immer: aborted zeigt nur den Zustand zum Zeitpunkt der Abfrage. Wenn gerade ein await läuft, erfährt man vom Abbruch erst beim nächsten Prüfen. Für eine sofortige Reaktion zusätzlich signal.addEventListener('abort', …, { once: true }) verwenden.
  • Kürzere Alternative: signal.throwIfAborted() ersetzt das Muster if (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: aborted selbst funktioniert in allen modernen Browsern und ab Node.js 15 global. Internet Explorer unterstützt es nicht. Ob reason gesetzt ist, hängt von der Laufzeitumgebung ab: Ältere Versionen setzen ihn nicht.