Generatoren sind Funktionen, die verlassen und später wieder betreten werden können. Ihr Kontext (Variablenbindungen) wird über Wiedereintritte hinweg gespeichert.

Generatoren in JavaScript – insbesondere in Kombination mit Promises – sind ein sehr mächtiges Werkzeug für die asynchrone Programmierung, da sie die Probleme mit Callbacks, wie Callback Hell und Inversion of Control, abmildern – wenn auch nicht ganz beseitigen. Eine noch einfachere Lösung für diese Probleme kann jedoch mit asynchronen Funktionen erreicht werden.

Der Aufruf einer Generatorfunktion führt deren Körper nicht sofort aus; stattdessen wird ein Iteratorobjekt für die Funktion zurückgegeben. Wenn die next()-Methode des Iterators aufgerufen wird, wird der Körper der Generatorfunktion bis zum ersten yield-Ausdruck ausgeführt, der den Wert angibt, der vom Iterator zurückgegeben werden soll, oder, mit yield*, an eine andere Generatorfunktion delegiert. Die next()-Methode gibt ein Objekt mit einer value-Eigenschaft zurück, die den ausgegebenen Wert enthält, und einer done-Eigenschaft, die als Boolean angibt, ob der Generator seinen letzten Wert ausgegeben hat. Der Aufruf der next()-Methode mit einem Argument setzt die Ausführung der Generatorfunktion fort und ersetzt den yield-Ausdruck, bei dem die Ausführung unterbrochen wurde, durch das Argument von next().

Eine return-Anweisung in einem Generator führt, wenn sie ausgeführt wird, dazu, dass der Generator beendet wird (d.h. die done-Eigenschaft des von ihr zurückgegebenen Objekts wird auf true gesetzt). Wenn ein Wert zurückgegeben wird, wird er als value-Eigenschaft des vom Generator zurückgegebenen Objekts gesetzt.
Gleich einer return-Anweisung führt ein Fehler, der innerhalb des Generators ausgelöst wird, dazu, dass der Generator beendet wird – es sei denn, er wird im Hauptteil des Generators abgefangen.
Wenn ein Generator beendet ist, führen nachfolgende next()-Aufrufe keinen Code des Generators aus, sondern geben nur ein Objekt dieser Form zurück: {value: undefined, done: true}.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.