Signatur
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
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);
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);
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);
}
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}`);
}
// Wichtig · Fallstricke
- Kein
abort-Ereignis: Das Signal ist schon bei der Erzeugung abgebrochen. Listener, die du nachträglich mitaddEventListener('abort', …)oder überonabortregistrierst, werden nie aufgerufen. Eigene Funktionen sollten deshalb immer zuerstsignal.abortedprüfen odersignal.throwIfAborted()aufrufen. - Fehler richtig erkennen: Gibst du einen eigenen
reasonan, lehntfetch()genau mit diesem Wert ab und nicht mit einemAbortError. Ein Code wieif (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
reasongibt 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.