dh wie drücke ich das aus:
function *(next) {}
mit Pfeilen. Ich habe alle erdenklichen Kombinationen ausprobiert und kann keine Dokumentation dazu finden.
(verwendet derzeit den Knoten v0.11.14)
javascript
ecmascript-6
generator
arrow-functions
Ashley Coolman
quelle
quelle
function*
Anweisung (Funktionsschlüsselwort gefolgt von einem Sternchen) definiert eine Generatorfunktion."param*=>{ }
zu tun?function(){}
das nicht dasselbe tut wie()=>{}
?Antworten:
Das kannst du nicht. Es tut uns leid.
Laut MDN
Aus einem Spezifikationsdokument (mein Schwerpunkt):
quelle
.prototype
zum Beispiel keine ) und oft Einzeiler, während Generatoren so ziemlich das Gegenteil sind.this
, und musste denlet self = this
Hack schreiben , um im Generator darauf zugreifen zu können. Die lexikalische Scope + Pfeil-Syntax wäre schön gewesen. Leider, aber nicht gerade das Ende der Welt.function
Schlüsselwort als "schlechten Teil" der Sprache herab . Dafür gibt es gute Gründe. Für diese Menschen ist das Fehlen von Pfeilgeneratoren eine ärgerliche Inkonsistenz.Der Unterschied zwischen Inline-Funktionen und Pfeilfunktionen
Vor allem Pfeil-Funktionen
() => {}
sind nicht zu ersetzen , Inline-Funktionen gemachtfunction(){}
und sie sind unterschiedlich. Inline-Funktionen sind einfach Funktionen, daher stellt sich die Frage, was der Unterschied zwischen Pfeilfunktionen und Inline-Funktionen ist.Einige schnellere Details hier
Warum die Pfeilfunktion nicht als Generatoren verwendet werden kann
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Beachten Sie, dass Generatoren ohne
yield
keinen Sinn ergeben.Warum die Pfeilfunktion keine Ausbeute verwenden kann
http://tc39wiki.calculist.org/es6/arrow-functions/
Die Ausbeute in einer Pfeilfunktion löst einen semantischen Fehler aus: http://www.ecma-international.org/
Am Ende liegt der Grund in der tiefen Komplexität bei der Implementierung von ECMA6. C # erlaubt dies aus ähnlichen Gründen ebenfalls nicht .
quelle
()=>{}
viel dazu beitragen würde, den Unterschied zu einer Inline-Funktion zu verstehen und warum die Einschränkung für Generatoren besteht.*() => { yield bla; }
es nicht in Ordnung ist, aberasync () => { await bla; }
...Zusätzlich zu der oben erwähnten Diskussion auf esdiscuss.org und den ES6-Sitzungsnotizen des Ecma TC39-Ausschusses vom November 2013 wurden die Generatorpfeile in zwei ES7-Sitzungen im September 2016 erneut überprüft [1] [2] . Nach einer Diskussion über Vor- und Nachteile verschiedener Syntax (hauptsächlich
=*>
und=>*
) und einem Mangel an Begründungen und Anwendungsfällen für diese Funktion kamen sie zu dem Schluss, dass:Der Vorschlag für Generatorpfeile wurde mit Brendan Eich und Domenic Denicola als Champions auf Stufe 1 verschoben. Die oben erwähnte asynchrone Iteration wurde beendet und implementiert 2018 .
Im Oktober 2019 erschien ein offizielles Repo von Sergey Rubanov mit weiteren Diskussionen über Syntax und andere Details.
quelle
Ich hatte auch die gleiche Frage und kam hierher. Nachdem ich die Beiträge und Kommentare gelesen hatte, fühlte ich, dass die Verwendung des Generators in einer Pfeilfunktion vage zu sein scheint:
Dies ist möglicherweise der Hauptgrund dafür, dass der Generator in Bezug auf die Pfeilfunktion nicht implementiert wurde.
Aber wenn ich einer von ihnen wäre, hätte ich so denken können:
Das fühlt sich so an, als hätten wir eine asynchrone Funktion:
Da bei normaler Funktion das asynchrone Schlüsselwort vorhanden ist, wird es von der Pfeilfunktion verwendet -
async () =>
wahrscheinlichasync function()
.Es gibt jedoch kein Schlüsselwort wie
gen
odergenerator
und leider verwendet die Pfeilfunktion es nicht.Schlussfolgern:
Selbst wenn sie den Generator in der Pfeilfunktion implementieren möchten, müssen sie die Generatorsyntax in Kern js überdenken:
Und das wird ein großer Fehler sein. Es ist also ziemlich cool, die Pfeilfunktion vom Generator fernzuhalten.
Folgender @Bergi Kommentar :
Ich werde sagen, dass der zu verwendende Generatorzweck Run-Stop-Run ist, und daher denke ich nicht, dass wir uns um Prototypen, Lexika usw. kümmern müssen.
quelle
() ~> { yield 'a'; yield 'b'; }
. Um ehrlich zu sein, ich liebe Tildes.Ich weiß, dass dies sehr spät ist, aber ein weiterer möglicher Grund könnte die Syntax sein.
(*() => {})
funktioniert vielleicht , aber was ist mit(9 ** () => {})
? Ist das 9 hoch einer Pfeilfunktion, die zurückkehrtNaN
, oder ist es 9 mal eine Generatorpfeilfunktion, die ebenfalls zurückkehrtNaN
? Dies könnte mit einer alternativen Syntax erfolgen, wie=>*
in einer anderen Antwort hier erwähnt, aber möglicherweise bestand der Wunsch, die Konsistenz der Generatorfunktionssyntax (z. B.function* () {}
und{ *genMethod() {} }
) bei der Implementierung beizubehalten. Keine allzu große Entschuldigung, aber ein Grund dafür.quelle
Im Moment können Sie nicht, aber in Zukunft könnten Sie sein, weil TC39 Release- Vorschlag für das gleiche im Oktober 2019, das sich in Stufe 1 befindet.
quelle
Es gibt eine schöne Problemumgehung mit Redux-Saga
quelle