Der Spezifikationsentwurf von ECMAScript 6 hat dem modernen JavaScript-Entwickler bereits viele Freude gemacht. In einem vorherigen Beitrag haben wir einige neue Sammlungsklassen und for..of
-Iterationsschleifen behandelt. In diesem Beitrag behandeln wir etwas, das Hand in Hand mit for..of
-Schleifen geht: Generatorfunktionen.
Es gibt bereits einen Moderator hervorragendem Material, das erklärt, warum und wie Generatoren eingesetzt werden können. Generatoren sind spezielle Funktionen, mit denen iteratoren erstellt werden. Iteratoren sind Objekte mit einer next()
-Methode, die aufgerufen werden kann, um einen Wert zu erhalten. Innerhalb einer Generatorfunktion liefert das Schlüsselwort yield
den Wert für next()
. Mit yield
wird die Ausführung der Generatorfunktion unterbrochen und der Zustand wird beibehalten, bis next()
erneut aufgerufen wird. Dann startet der Code wieder und wird fortgesetzt, bis ein anderer Wert yield
(oder bis die Generatorfunktion beendet wird) wird. Es gibt mehrere kanonische Anwendungsfälle für Generatorfunktionen, z. B. die Verwendung zur Iteration über die Zahlen in der Fibonacci-Sequenz.
Nachdem wir die Grundlagen aus dem Weg geräumt haben, schauen wir uns nun ein JavaScript-Beispiel an, das einige der Tricks der Arbeit mit Generatoren behandelt. Es gibt durchgehend umfangreiche Kommentare und Sie können mit der Live-Version des Codes experimentieren, bevor Sie sich den Code durchlesen:
Was sind also ein paar wichtige Erkenntnisse, die aus dem Code abgeleitet werden können?
Zunächst führt die Konstruktion eines Generators zu einem eindeutigen Iterator mit einem eigenen unterschiedlichen Status, und Sie können Parameter an den Generator-Konstruktor übergeben, der das Verhalten steuern kann.
Zweitens können Sie einen Parameter übergeben, wenn Sie die next()
-Methode eines Iterators aufrufen. Dieser Wert wird dann dem Wert zugewiesen, der sich auf der linken Seite der yield
-Anweisung aus dem vorherigen Iterationsaufruf befindet. Auf diese Weise lässt sich die Ausgabe des Iterators hervorragend variieren. Hier steuern wir damit, ob das zurückgegebene Wort in Großbuchstaben geschrieben wird oder nicht. Wenn Sie den allerersten Wert beeinflussen möchten, der erzeugt wird, tun Sie dies über einen -Parameter an den Konstruktor des Generators.
Schließlich können Generatoren entweder endliche oder unendliche Iteratoren erzeugen. Wenn Sie mit einem unendlichen Iterator arbeiten, achten Sie darauf, dass Sie eine Art Terminalbedingung basierend auf dem Wert yield
ed haben. Es kann sehr leicht versehentlich Endlosschleifen schreiben, insbesondere wenn for..of
für die Iteration verwendet wird. Wenn Sie mit einem endlichen Iterator über Aufrufe von next()
arbeiten, signalisiert das Attribut .done
des zurückgegebenen Objekts, ob die Iteration abgeschlossen ist.
Wir hoffen, dass dieses Beispiel und die anderen im Web verfügbaren Ressourcen für Sie interessant sind und Sie zum Nachdenken darüber anregen, wie Sie Generatoren in Ihrem eigenen Code verwenden können. Firefox-Versionen ab Version 31 und Chrome-Versionen ab Version 39 unterstützen Generatoren nativ. Das Regenerator-Projekt bietet Generator-Unterstützung für andere Browser und die Verwendung von Traceur ist ebenfalls eine Option.
Vielen Dank an Erik Arvidsson für seine Hilfe beim Lesen dieses Artikels.