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}
.