JavaScript Promises, Async/Await und Fetch

JavaScript Promises, Async/Await und Fetch: 15 ausführbare Beispiele | We.Inc

Promises, async/await und die fetch API mit einer schrittweisen Event-Loop-Zeitleiste und 15 Beispielen, die du bearbeiten und ausführen kannst: JSON, Formulare, Fehler, parallele Requests, AbortController und Retry.

JavaScript Promises, Async/Await und Fetch

Ein Promise steht für ein Ergebnis, das später eintrifft. async-Funktionen geben Promises zurück, und await pausiert diese Funktion, bis eines erledigt ist. fetch(url) gibt ein Promise auf eine Response zurück: Prüfe response.ok und dann await response.json(). Pack awaits in try und catch, nutze Promise.all für parallele Requests und AbortController zum Abbrechen.

Das Muster, das die meisten Seiten brauchen

Beginne mit der Zeitleiste, um zu sehen, warum Code nach einem await vor diesem laufen kann. Bearbeite dann ein beliebiges Beispiel, und es läuft sofort neu. Die Requests hier nutzen data:-URLs oder simulierte Server, sodass nichts deinen Browser verlässt.

Häufige Fragen

Was ist der Unterschied zwischen Promises und async/await?

Im Funktionsumfang keiner: async/await baut auf Promises auf. Eine async-Funktion gibt immer ein Promise zurück, und await packt eines aus. Es liest sich wie normaler Schritt-für-Schritt-Code, wodurch sich Fehler leichter mit try und catch behandeln lassen.

Warum wirft fetch bei einem 404 keinen Fehler?

fetch behandelt jede HTTP-Antwort als erfolgreichen Request, denn der Server hat ja geantwortet. Es lehnt nur bei Netzwerkfehlern oder einem abgebrochenen Request ab. Prüfe response.ok oder response.status selbst.

Warum läuft setTimeout mit 0 nach einem aufgelösten Promise?

Promise-Callbacks landen in der Microtask-Queue, die nach dem aktuellen Skript vollständig geleert wird. Ein Timer-Callback ist ein Task, der auf die nächste Runde des Event Loops wartet.

Wie breche ich einen fetch-Request ab?

Erstelle einen AbortController, übergib controller.signal in den fetch-Optionen und rufe controller.abort() auf. Das fetch-Promise wird mit einem Fehler namens AbortError abgelehnt.

Kann ich await auf oberster Ebene verwenden?

Ja, in JavaScript-Modulen (script type="module" oder jedes gebündelte ES-Modul). In klassischen Skripten packst du den Code in eine async-Funktion.

Fehler, die dir begegnen werden

Einsatz auf einer echten Website

Promises und async/await

1. Was wann läuft

Synchrone Zeilen laufen zuerst, dann jeder wartende Promise-Callback (Microtasks), dann der Timer (ein Task). Ändere die Reihenfolge und führe es erneut aus.

2. Ein Promise erstellen

Ein Promise wird genau einmal erledigt: resolve liefert einen Wert, reject einen Fehler. then und catch laufen später, nie sofort.

3. Dasselbe mit async und await

await pausiert nur die async-Funktion, in der es steht. Die Zeile nach dem Aufruf von main() läuft, bevor main fertig ist.

4. Fehler mit try, catch und finally

In einer async-Funktion wirft ein abgelehntes await einen Fehler, also funktionieren ganz normale try und catch. finally ist der Ort, um einen Spinner auszublenden.

fetch für echte Website-Aufgaben

5. JSON mit fetch laden

fetch gibt eine Response zurück; .json() liest und parst den Body, was ein zweites await ist. Dieses Beispiel nutzt eine data:-URL und funktioniert daher offline.

6. Ein 404 ist für fetch kein Fehler

fetch lehnt nur ab, wenn der Request gar nicht ausgeführt werden kann (offline, blockiert, ungültige URL). Ein 404 oder 500 wird normal aufgelöst, mit ok auf false, also prüfe es immer.

7. Ein Formular mit fetch senden

FormData liest jedes benannte Feld. Hier wird der Request gebaut, aber nicht gesendet, und sein Body wird ausgegeben, damit du genau siehst, was ein Server bekäme.

8. JSON per POST senden

Sende JSON, indem du es in einen String umwandelst und den Content-Type-Header selbst setzt; fetch erledigt beides bei einfachen Objekten nicht.

Mehrere Requests gleichzeitig

Welchen Promise-Helfer du nutzen solltest

9. Sequenziell gegen parallel

Wartest du auf einen Aufruf nach dem anderen, addieren sich die Wartezeiten. Startest du alle und wartest auf Promise.all, dauert es nur so lange wie der langsamste.

10. Promise.all gegen Promise.allSettled

Promise.all lehnt ab, sobald einer fehlschlägt. allSettled wartet auf alle und sagt dir, welche funktioniert haben, was zu Dashboards mit unabhängigen Widgets passt.

11. Viele Requests, immer nur ein paar gleichzeitig

Hunderte Requests auf einmal abzufeuern kann Rate Limits auslösen. Dieser kleine Pool hält höchstens drei gleichzeitig am Laufen.

Abbrechen, Timeout, Retry

12. Abbrechen mit AbortController

Übergib controller.signal an fetch und rufe abort() auf, um es zu stoppen. Das Promise wird mit einem AbortError abgelehnt, den du meist ignorierst.

13. Nach einem Timeout aufgeben

AbortSignal.timeout(ms) erzeugt ein Signal, das von selbst abbricht. Bei fetch heißt der Fehler TimeoutError, sodass du ihn von einem Abbruch durch den Nutzer unterscheiden kannst.

14. Retry mit Backoff

Wiederhole nur Fehler, die vorübergehen können, etwa einen Timeout oder einen 503, und warte jedes Mal länger, damit sich ein überlasteter Server erholen kann.

15. Suche beim Tippen, ohne veraltete Ergebnisse

Warte auf eine Tipppause und brich den vorherigen Request ab, wenn ein neuer startet, damit eine alte, langsame Antwort nie eine neuere überschreiben kann.

Hast du eine Antwort, die du lesen musst? Füge sie ein in den

JSON-Formatierer

Event-Loop-Zeitleiste

Call Stack

Microtasks

Task-Queue

Konsole

Schritt {i} von {n}.

Zurück

Nächster Schritt

Pause

Abspielen

Zurücksetzen

Kostenlos starten · Keine Kreditkarte nötig

Verwandt: Ratgeber

Produkt

Für wen

Funktionen

Ressourcen

Unternehmen

Sitemap