async function*
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.
Die Deklarationasync function*
erstellt eineBindung einer neuen asynchronen Generatorfunktion zu einem gegebenen Namen.
Sie können asynchrone Generatorfunktionen auch mit demasync function*
Ausdruck definieren.
Probieren Sie es aus
async function* foo() { yield await Promise.resolve("a"); yield await Promise.resolve("b"); yield await Promise.resolve("c");}let str = "";async function generate() { for await (const val of foo()) { str += val; } console.log(str);}generate();// Expected output: "abc"
Syntax
async function* name(param0) { statements}async function* name(param0, param1) { statements}async function* name(param0, param1, /* …, */ paramN) { statements}
Hinweis:Asynchrone Generatorfunktionen haben keine Gegenstücke in Pfeilfunktionen.
Hinweis:function
und*
sind separate Tokens, daher können sie durchLeerzeichen oder Zeilentrenner getrennt werden. Es darf jedoch kein Zeilentrenner zwischenasync
undfunction
stehen, da ansonsten ein Semikolonautomatisch eingefügt wird, wodurchasync
zu einem Bezeichner wird und der Rest zu einerfunction*
Deklaration.
Parameter
name
Der Funktionsname.
param
OptionalDer Name eines formalen Parameters für die Funktion. Informationen zur Syntax der Parameter finden Sie imFunktionsleitfaden.
statements
OptionalDie Anweisungen, die den Körper der Funktion bilden.
Beschreibung
Eineasync function*
Deklaration erstellt einAsyncGeneratorFunction
Objekt. Jedes Mal, wenn eine asynchrone Generatorfunktion aufgerufen wird, gibt sie ein neuesAsyncGenerator
Objekt zurück, das demasynchronen Iterator-Protokoll entspricht. Jeder Aufruf vonnext()
gibt einPromise
zurück, das sich auf das Iterator-Ergebnisobjekt auflöst.
Eine asynchrone Generatorfunktion kombiniert die Merkmale vonasynchronen Funktionen undGeneratorfunktionen. Sie können sowohl die Schlüsselwörterawait
als auchyield
innerhalb des Funktionskörpers verwenden. Dies ermöglicht es Ihnen, asynchrone Aufgaben auf ergonomische Weise mitawait
zu bearbeiten, während Sie die träge Natur von Generatorfunktionen nutzen.
Wenn ein Promise aus einem asynchronen Generator übergeben wird, wird der endgültige Zustand des Iterator-Ergebnis-Promises dem des übergebenen Promises entsprechen. Zum Beispiel:
async function* foo() { yield Promise.reject(new Error("failed"));}foo() .next() .catch((e) => console.error(e));
Error: failed
wird protokolliert, da wenn das übergebene Promise abgelehnt wird, das Iterator-Ergebnis ebenfalls abgelehnt wird. Dievalue
-Eigenschaft des aufgelösten Ergebnisses eines asynchronen Generators wird kein weiteres Promise sein.
async function*
Deklarationen verhalten sich ähnlich wiefunction
Deklarationen — sie werdengehoisted an den Anfang ihres Bereichs und können überall in ihrem Bereich aufgerufen werden, und sie können nur in bestimmten Kontexten erneut deklariert werden.
Beispiele
Deklarieren einer asynchronen Generatorfunktion
Asynchrone Generatorfunktionen erzeugen immer Promises von Ergebnissen — sogar wenn jederyield
Schritt synchron ist.
async function* myGenerator(step) { await new Promise((resolve) => setTimeout(resolve, 10)); yield 0; yield step; yield step * 2;}const gen = myGenerator(2);gen .next() .then((res) => { console.log(res); // { value: 0, done: false } return gen.next(); }) .then((res) => { console.log(res); // { value: 2, done: false } return gen.next(); }) .then((res) => { console.log(res); // { value: 4, done: false } return gen.next(); }) .then((res) => { console.log(res); // { value: undefined, done: true } return gen.next(); });
Verwenden einer asynchronen Generatorfunktion zum Lesen einer Reihe von Dateien
In diesem Beispiel lesen wir eine Reihe von Dateien und greifen nur auf deren Inhalt zu, wenn dies angefordert wird, mit Hilfe des Nodefs/promises
Moduls.
async function* readFiles(directory) { const files = await fs.readdir(directory); for (const file of files) { const stats = await fs.stat(file); if (stats.isFile()) { yield { name: file, content: await fs.readFile(file, "utf8"), }; } }}const files = readFiles(".");console.log((await files.next()).value);// Possible output: { name: 'file1.txt', content: '...' }console.log((await files.next()).value);// Possible output: { name: 'file2.txt', content: '...' }
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-async-generator-function-definitions |
Browser-Kompatibilität
Siehe auch
MDN-Feedback-Box
Diese Seite wurde automatisch aus dem Englischen übersetzt.