Start · Sprachen · JavaScript · Referenz · AbortSignal.abort()

AbortSignal.abort()

Methode

Statische Methode, die ein bereits abgebrochenes <code>AbortSignal</code> zurückgibt – ohne dass dabei ein <code>abort</code>-Ereignis ausgelöst wird.

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

Signatur

AbortSignal.abort(reason)

Beschreibung

AbortSignal.abort() erzeugt ein AbortSignal, dessen Eigenschaft aborted von Anfang an true ist. Früher brauchte man dafür einen Umweg: einen AbortController anlegen, sofort abort() aufrufen und dann dessen signal weitergeben. Die statische Methode erledigt das in einem einzigen Aufruf.

Nützlich ist das vor allem, wenn eine Funktion ein Signal erwartet, der Vorgang aber schon vorher nicht mehr gewünscht ist. Typische Fälle: Tests für die Abbruchlogik, Standardwerte in APIs, die immer ein Signal brauchen, und das frühe Ablehnen asynchroner Vorgänge, zum Beispiel wenn der Nutzer nicht angemeldet ist. fetch() wird mit so einem Signal sofort mit dem hinterlegten Grund abgelehnt, und es geht keine Anfrage über das Netzwerk.

Über den optionalen Parameter reason legst du den Abbruchgrund fest. Er steht danach in signal.reason. Gibst du keinen an, wird automatisch eine DOMException mit dem Namen "AbortError" gesetzt.

Wichtig: Das Signal ist schon bei der Erzeugung abgebrochen. Deshalb wird kein abort-Ereignis ausgelöst. Listener, die du später registrierst, werden nie aufgerufen. Prüfe deshalb immer zuerst signal.aborted oder rufe signal.throwIfAborted() auf.

Parameter

Name Typ Default Beschreibung
$reason any new DOMException('signal is aborted without reason', 'AbortError') Grund für den Abbruch, zum Beispiel ein Error, eine DOMException oder ein beliebiger Wert. Er steht danach in signal.reason. Fehlt er oder ist er undefined, wird eine DOMException vom Typ AbortError gesetzt.

Rückgabewert

Typ
AbortSignal
Beschreibung
Ein neues AbortSignal mit aborted === true. In reason steht der übergebene oder der standardmäßige Abbruchgrund.

Beispiele

Bereits abgebrochenes Signal erzeugen und prüfen

const signal = AbortSignal.abort();

console.log(signal.aborted);
console.log(signal.reason.name);
console.log(signal.reason instanceof DOMException);
true AbortError true

fetch() mit eigenem Abbruchgrund sofort ablehnen

const ladeDaten = async (istAngemeldet) => {
  // Nicht angemeldet: Anfrage sofort mit eigenem Grund abbrechen
  const signal = istAngemeldet
    ? AbortSignal.timeout(5000)
    : AbortSignal.abort(new Error('Nicht angemeldet'));

  try {
    const res = await fetch('https://api.example.com/profil', { signal });
    return await res.json();
  } catch (err) {
    console.log('Abgebrochen:', err.message);
    return null;
  }
};

await ladeDaten(false);
Abgebrochen: Nicht angemeldet

Abbruchlogik einer eigenen async-Funktion testen

const warte = (ms, { signal } = {}) =>
  new Promise((resolve, reject) => {
    // Wichtig: zuerst prüfen, denn bei AbortSignal.abort() gibt es kein abort-Ereignis
    if (signal?.aborted) return reject(signal.reason);

    const id = setTimeout(resolve, ms);
    signal?.addEventListener('abort', () => {
      clearTimeout(id);
      reject(signal.reason);
    }, { once: true });
  });

try {
  await warte(1000, { signal: AbortSignal.abort('Test-Abbruch') });
} catch (grund) {
  console.log('Promise abgelehnt mit:', grund);
}
Promise abgelehnt mit: Test-Abbruch

throwIfAborted() für einen frühen Abbruch

const verarbeite = (daten, signal) => {
  signal.throwIfAborted();
  return daten.map((x) => x * 2);
};

try {
  verarbeite([1, 2, 3], AbortSignal.abort(new RangeError('Zu spät')));
} catch (e) {
  console.log(`${e.name}: ${e.message}`);
}
RangeError: Zu spät

// Wichtig · Fallstricke

  • Kein abort-Ereignis: Das Signal ist schon bei der Erzeugung abgebrochen. Listener, die du nachträglich mit addEventListener('abort', …) oder über onabort registrierst, werden nie aufgerufen. Eigene Funktionen sollten deshalb immer zuerst signal.aborted prüfen oder signal.throwIfAborted() aufrufen.
  • Fehler richtig erkennen: Gibst du einen eigenen reason an, lehnt fetch() genau mit diesem Wert ab und nicht mit einem AbortError. Ein Code wie if (err.name === 'AbortError') greift dann nicht mehr.
  • Unveränderlich: Du kannst das Signal nicht zurücksetzen. Für einen neuen Versuch brauchst du ein neues Signal bzw. einen neuen AbortController.
  • Kompatibilität: Die Methode wird in allen aktuellen Browsern unterstützt: Chrome/Edge 93+, Firefox 88+, Safari 15+. In Node.js gibt es sie ab 15.12. Den Parameter reason gibt es erst seit Chrome 98, Firefox 97, Safari 15.4 und Node.js 17.2. Ältere Umgebungen ignorieren ihn stillschweigend. Als Ersatz für alte Umgebungen: const c = new AbortController(); c.abort(); c.signal.