Generatoren ist ein Coroutine (Coroutine) -Stil von JavaScript. Es bezieht sich auf Funktionen, die während der Ausführung angehalten und dann wieder aufgenommen werden können. Die Funktion wird von Sternchensymbolen in der Funktion wie Funktion*und einigen charakteristischen Schlüsselwörtern in der Funktion wie Ertrag und Ertrag*begleitet.
Funktion* generatorfn () {console.log ('Look ma I wurde suspendiert')} var generator = generatorfn () // [1] setTimeout (function () {generator.next () // [2]}, 2000)Die im Code markierten [1] und [2] werden wie folgt erklärt:
1. Dies ist ein Generator, der mit einer Pause beginnt. Zu diesem Zeitpunkt gibt es keine Konsolenausgabe.
2. Wenn Sie nur seine nächste () -Methode aufrufen, kann der Generator ausgeführt und ausgeführt werden, bis er auf das nächste Keyword oder die Rückgabe des nächsten Renditens trifft. Jetzt haben wir die Konsolenausgabe.
Schauen wir uns einen anderen Fall an:
Funktion *Generator () {console.log ('start!'); var i = 0; while (wahr) {if (i <3) ergeben i ++; }} var gen = Generator ();Der obige Code ähnelt dem ersten, es gibt jedoch ein zusätzliches Keyword in der Generatorfunktion. Wenn der obige Code aufgerufen wird, wird er nicht sofort ausgeführt, sondern den Standby -Status pausieren, sodass es keine Startausgabe gibt. Es wird erst im nächsten () Anruf ausgeführt.
var ret = gen.next (); // start! console.log (ret); // {value: 0, fertig: false}Das obige Ret ist das Generatorergebnis. Es hat zwei Eigenschaften:
■ Wert, Renotenwert in der Generatorfunktion,
■ Dies ist ein Flag, das angibt, ob die Generatorfunktion zurückgibt.
Setzen Sie den Code wie folgt fort:
console.log (gen.next ()); // {value: 1, tätig: false} console.log (gen.next ()); // {value: 2, tätig: false} console.log (gen.next ()); // {value: unddefined, true: true}Generator hat kein Rätsel in der synchronen Programmierung und eignet sich besonders für asynchrone Programme.
Generator hat zwei Eigenschaften:
1. Sie können wählen, ob Sie aus einer Funktion herausspringen können. Lassen Sie den externen Code entscheiden, wann Sie zu dieser Funktion zurückkehren und die Ausführung fortsetzen sollen.
2., in der Lage, eine asynchrone Kontrolle durchzuführen.
Schauen Sie sich den folgenden asynchronen Ausführungscode an:
var gen = generator (); console.log (gen.Next (). value); setTimeout (function () {console.log (gen.Next (). value); console.log ('erster Schritt');}, 1000); console.log ('zweiter Schritt');Die Ausgabe ist:
0
Schritt 2
1
Erster Schritt
Mit anderen Worten, Sie warten nicht, bis das Timeout bei SetTimeout endet, sondern wird direkt mit dem "zweiten Schritt" fortgesetzt und wird bei SetTimeout nicht blockiert.
Schauen wir uns einen anderen Code an:
Funktion* Channel () {var name = relief 'Hallo, wie heißt du?' // [1] return 'gut hi to' + name} var gen = Channel () console.log (gen.next (). Wert) // Hallo, wie heißt du? [2] console.log (Gen.Next ('Billy')) // Nun Hallo Billy [3]Sie können auch * während der Durchquerung verwenden:
Funktion* iter () {für (var i = 0; i <10; i ++) liefern i} für (var val von iter ()) {console.log (val) // Ausgänge 1? -? 9}Gemeinsame Missverständnisse
Sollte ich sie parallel ausführen lassen, da ich eine Funktionsausführung innehalten kann? Nein, weil JavaScript ein einzelner Thread ist und wenn Sie Leistungsverbesserungen suchen möchten, ist Generator nicht Ihr Gericht.
Beispielsweise führt der folgende Code Fibonacci -Zahlen separat aus:
Funktionsfib (n) {var current = 0, next = 1, Swap for (var i = 0; i <n; i ++) {swap = current, current = next = swap+next} return} Funktion* fibgen (n) {var current = 0, nächstDie Leistungsergebnisse sind wie folgt: (Je höher umso besser)
Ergebnisse:
Regular 1263899
Generator 37541
Generatoren glänzen
Generatoren können die Komplexität der Funktionen in JavaScript vereinfachen.
Faule Aufgabe
Obwohl eine faule Zuordnung mit JS -Verschluss implementiert werden kann, wird die Verwendung der Ertrag erheblich vereinfacht. Durch Pause und Wiederherstellung können wir numerische Werte erhalten, wenn wir sie brauchen. Beispielsweise kann die obige Fibgen -Funktion neue Werte ziehen, wenn wir sie benötigen:
var fibiter = fibgen (20) var next = fibiter
Unendliche Sequenz
Da Sie faul sein können, Werte zuzuweisen, können Sie einige Haskell -Tricks ausführen, ähnlich wie bei unendlichen Sequenzen. Hier können Sie die Anzahl einer unendlichen Sequenz ergeben.
Funktion* fibgen () {var curr Current = 0, next = 1, Swap wobSchauen wir uns die faule Zuordnung eines Fibonacci -Streams an und bitten Sie ihn, die erste Fibonacci -Nummer nach 5000 zurückzugeben:
für (var num von fibgen ()) {if (num> 5000) break} console.log (num) // 6765Asynchrone Prozesskontrolle
Verwenden von Generatoren zur Implementierung einer asynchronen Prozesskontrolle, am häufigsten verschiedene Versprechenbibliothekspakete. Wie funktioniert es also?
In der Knotenwelt hängt alles mit Rückrufen zusammen, was unsere asynchrone Funktion auf niedriger Ebene ist. Wir können Generatoren verwenden, um einen Kommunikationskanal zu erstellen, um asynchronen Code im Stil der synchronen Programmierung zu schreiben.
run (function* () {console.log ("starten") var file = relief readFile ("./ async.js") // [1] console.log (File.toString ())})Hinweis 1 bedeutet, dass das Programm fortgesetzt wird, bevor Async.js das Ergebnis zurückgibt.
Genify ist ein Framework, der Generatoren in eine normale Programmierumgebung bringt, wobei Folgendes verwendet wird:
NPM Installieren Sie Genify für die Installation, der Code lautet wie folgt:
var q = require ('q'); var fs = require ('fs'); var genify = require ('Genify'); // Wickeln Sie Ihr Objekt in Genify FunctionVar Object = Genify ({concatFiles: function * (Datei1, Datei2, Outfile) {Datei1 = Ertrag q.nfcall (fs.ReadFile, Datei1); Datei2 = Ertrag q.nfcall (fs übereinstimmt;}}); // Concatfiles ist eine Generatorfunktion, die die leistungsstarken Funktionen von Generatoren nutzt. Object.concatFiles ('./ SomeFile1.txt', './somefile2.txt', './concated.txt').Then(Function (res) {// etwas mit Ergebnis}, Funktion (err) {// etwas mit Fehler});Die obige detaillierte Erläuterung der Verwendung von JavaScript -Generatoren in node.js ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.