Start · Sprachen · JavaScript · Referenz · async function* expression

async function* expression

Operator

Definiert eine asynchrone Generatorfunktion als Ausdruck, die sowohl <code>await</code> als auch <code>yield</code> verwenden kann und einen <code>AsyncGenerator</code> zurückgibt.

seit JavaScript ES2018 Kategorie: syntax

Signatur

async function* name(params) { /* body */ }

Beschreibung

Der async function*-Ausdruck kombiniert die Konzepte asynchroner Funktionen (async function) und Generatorfunktionen (function*) zu einer einzigen, mächtigen Abstraktion. Das Ergebnis eines solchen Ausdrucks ist eine Funktion, deren Aufruf ein AsyncGenerator-Objekt liefert — ein Objekt, das gleichzeitig das AsyncIterator- und das AsyncIterable-Protokoll implementiert.

Innerhalb des Funktionskörpers stehen beide Schlüsselwörter await und yield zur Verfügung. Mit await wird auf Promises gewartet, ohne den restlichen Code zu blockieren. Mit yield wird ein Wert nach außen gereicht und die Ausführung pausiert, bis der Konsument per .next() den nächsten Wert anfordert. Die Kombination yield* delegiert an ein anderes (asynchrones) Iterable.

Der typische Anwendungsfall sind lazy, unendliche oder sehr große Datenströme, die auf asynchronen Quellen beruhen — etwa paginierte API-Antworten, Datenbankstreams, WebSocket-Nachrichten oder das zeilenweise Einlesen großer Dateien. Der Konsument iteriert mit for await...of über die gelieferten Werte und verarbeitet jeden Chunk, sobald er bereit ist.

Wie bei gewöhnlichen Funktionsausdrücken ist der Name optional (anonymer Ausdruck). Wird ein Name angegeben, ist er nur innerhalb des eigenen Funktionskörpers sichtbar und ermöglicht Rekursion. Der Ausdruck kann einer Variablen zugewiesen, als Argument übergeben oder direkt aufgerufen werden (IIFE-Stil mit anschließendem for await...of).

Parameter

Name Typ Default Beschreibung
$name string Optionaler Name der Funktion. Nur innerhalb des Funktionskörpers sichtbar (z. B. für Rekursion). Wird der Ausdruck einer Variablen zugewiesen, übernimmt die Funktion deren Namen automatisch (name inference).
$params string Kommagetrennte Liste von Parametern. Unterstützt alle modernen Parameter-Syntaxen: Standardwerte (x = 0), Rest-Parameter (...rest) und Destructuring.
$body Pflicht string Der Funktionskörper mit beliebigem JavaScript-Code. Darf await-Ausdrücke (für Promises) und yield-Ausdrücke (zum Emittieren von Werten) enthalten. return beendet die Sequenz und liefert den done: true-Wert.

Rückgabewert

Typ
AsyncGenerator
Beschreibung
Beim Aufrufen des erzeugten Funktionsobjekts wird ein AsyncGenerator-Objekt zurückgegeben, das die Methoden .next(value), .return(value) und .throw(error) besitzt — jede davon gibt ein Promise<{value, done}> zurück. Das Objekt ist außerdem direkt mit for await...of iterierbar.

// Wichtig · Fallstricke

Fehlerbehandlung: Exceptions aus await-Ausdrücken oder explizite throw-Statements können innerhalb des Generators mit try/catch/finally abgefangen werden. finally wird auch dann ausgeführt, wenn der Konsument per gen.return() abbricht — ideal zum Aufräumen von Ressourcen (z. B. offene Verbindungen schließen).

Unterschied zur async function*-Deklaration: Ein Ausdruck (const gen = async function* () {}) wird nicht gehoisted, eine Deklaration (async function* gen() {}) hingegen schon (nur der Bezeichner, nicht die Initialisierung). Für anonyme Callbacks oder Zuweisungen ist der Ausdruck die üblichere Wahl.

Speicherverwaltung: Ein nicht vollständig konsumierter AsyncGenerator hält interne Ressourcen (Closures, Verbindungen etc.) offen. Wird for await...of durch break oder return beendet, ruft die Laufzeit automatisch gen.return() auf — das löst den finally-Block aus. Bei manueller Iteration via .next() muss .return() selbst aufgerufen werden.

Browser-/Node.js-Kompatibilität: async function* ist seit ES2018 standardisiert und wird in allen modernen Browsern sowie Node.js ab Version 10 nativ unterstützt. Ältere Umgebungen benötigen einen Transpiler (Babel) mit entsprechenden Regenerator-Polyfills.