AsyncGenerator

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.

Das AsyncGenerator-Objekt wird von einer asynchronen Generatorfunktion zurückgegeben und entspricht sowohl dem asynchronen iterierbaren Protokoll als auch dem asynchronen Iterator-Protokoll.

Asynchrone Generator-Methoden geben immer Promise-Objekte zurück.

AsyncGenerator ist eine Unterklasse der versteckten AsyncIterator-Klasse.

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 = str + val;
  }
  console.log(str);
}

generate();
// Expected output: "abc"

Konstruktor

Es gibt keine JavaScript-Entität, die dem AsyncGenerator-Konstruktor entspricht. Instanzen von AsyncGenerator müssen von asynchronen Generatorfunktionen zurückgegeben werden:

js
async function* createAsyncGenerator() {
  yield Promise.resolve(1);
  yield await Promise.resolve(2);
  yield 3;
}
const asyncGen = createAsyncGenerator();
asyncGen.next().then((res) => console.log(res.value)); // 1
asyncGen.next().then((res) => console.log(res.value)); // 2
asyncGen.next().then((res) => console.log(res.value)); // 3

Es gibt nur ein verstecktes Objekt, das das Prototyp-Objekt ist, welches von allen Objekten geteilt wird, die durch asynchrone Generatorfunktionen erstellt wurden. Dieses Objekt wird oft als AsyncGenerator.prototype stilisiert, um es wie eine Klasse aussehen zu lassen. Es sollte jedoch eher AsyncGeneratorFunction.prototype.prototype genannt werden, da AsyncGeneratorFunction eine tatsächliche JavaScript-Entität ist. Um die Prototyp-Kette von AsyncGenerator-Instanzen zu verstehen, siehe AsyncGeneratorFunction.prototype.prototype.

Instanz-Eigenschaften

Diese Eigenschaften sind auf AsyncGenerator.prototype definiert und werden von allen AsyncGenerator-Instanzen geteilt.

AsyncGenerator.prototype.constructor

Die Konstruktorfunktion, die das Instanzobjekt erstellt hat. Für AsyncGenerator-Instanzen ist der Anfangswert AsyncGeneratorFunction.prototype.

Hinweis: AsyncGenerator-Objekte speichern keinen Verweis auf die asynchrone Generatorfunktion, die sie erstellt hat.

AsyncGenerator.prototype[Symbol.toStringTag]

Der Anfangswert der [Symbol.toStringTag]-Eigenschaft ist der String "AsyncGenerator". Diese Eigenschaft wird in Object.prototype.toString() verwendet.

Instanz-Methoden

Erbt außerdem Instanz-Methoden von seinem übergeordneten AsyncIterator.

AsyncGenerator.prototype.next()

Gibt ein Promise zurück, das mit dem im `yield`-Ausdruck übergebenen Wert aufgelöst wird.

AsyncGenerator.prototype.return()

Führt so, als ob eine return-Anweisung in den Körper des Generators an der aktuellen unterbrochenen Position eingefügt wird. Dadurch wird der Generator beendet und ermöglicht es, dass der Generator Aufräumaufgaben durchführen kann, wenn er zusammen mit einem try...finally-Block verwendet wird.

AsyncGenerator.prototype.throw()

Führt so, als ob eine throw-Anweisung in den Körper des Generators an der aktuellen unterbrochenen Position eingefügt wird. Dies informiert den Generator über eine Fehlersituation und ermöglicht es ihm, den Fehler zu behandeln, oder führt Bereinigung durch und schließt sich selbst.

Beispiele

Asynchrone Generator-Iteration

Das folgende Beispiel iteriert über einen asynchronen Generator und protokolliert die Werte 1–6 in der Konsole mit abnehmenden Zeitintervallen. Beachten Sie, dass jedes Mal ein Promise zurückgegeben wird, das automatisch innerhalb der for await...of-Schleife aufgelöst wird.

js
// An async task. Pretend it's doing something more useful
// in practice.
function delayedValue(time, value) {
  return new Promise((resolve /*, reject*/) => {
    setTimeout(() => resolve(value), time);
  });
}

async function* generate() {
  yield delayedValue(2000, 1);
  yield delayedValue(1000, 2);
  yield delayedValue(500, 3);
  yield delayedValue(250, 4);
  yield delayedValue(125, 5);
  yield delayedValue(50, 6);
  console.log("All done!");
}

async function main() {
  for await (const value of generate()) {
    console.log("value", value);
  }
}

main().catch((e) => console.error(e));

Spezifikationen

Specification
ECMAScript® 2025 Language Specification
# sec-asyncgenerator-objects

Browser-Kompatibilität

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
AsyncGenerator
next
return
throw

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

Siehe auch