dh wie drücke ich das aus:
function *(next) {}
mit pfeilen. Ich habe alle Kombinationen ausprobiert, die ich mir vorstellen konnte, und ich kann keine Dokumentation dazu finden.
(derzeit mit Knoten v0.11.14)
Kann ich die Pfeilfunktionssyntax von ES6 mit Generatoren verwenden?
Du kannst nicht Es tut uns leid.
Nach MDN
Die
function*
-Anweisung (function
Schlüsselwort gefolgt von einem Sternchen) definiert eine Generatorfunktion.
Aus einem Spezifikationsdokument (mein Schwerpunkt):
Die Syntax function wurde erweitert, um ein optionales
*
-Token hinzuzufügen:
FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")"
"{" FunctionBody "}"
Zunächst werden Pfeil-Funktionen() => {}
nicht als Ersatz für die Inline-Funktionen function(){}
gemacht und sie sind verschieden . Inline-Funktionen sind einfach Funktionen, daher stellt sich die Frage, was der Unterschied zwischen Pfeil-Funktionen und Inline-Funktionen ist sind.
Ein Pfeilfunktionsausdruck (auch als Pfeilfunktion bezeichnet) hat im Vergleich zu Funktionsausdrücken eine kürzere Syntax und bindet nicht seine eigene
this
,arguments
,super
odernew.target
). Pfeilfunktionen sind immer anonym.
Noch ein paar schnelle Details hier
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Verwendung des Ertragsschlüsselworts
Das Schlüsselwort yield darf nicht im Hauptteil einer Pfeilfunktion verwendet werden (es sei denn, dies ist in weiter verschachtelten Funktionen zulässig). Folglich können Pfeilfunktionen nicht als Generatoren verwendet werden.
Beachten Sie, dass Generatoren ohne yield
keinen Sinn ergeben.
http://tc39wiki.calculist.org/es6/arrow-functions/
Pfeilfunktionen binden
this
lexikalisch, bindenreturn
im Körperkörper Block so, dass sie von der unmittelbar einschließenden Pfeilfunktion zurückkehren undbreak
undcontinue
von Anweisungen außerhalb der unmittelbar einschließenden Pfeilfunktion ausschließen.Der Bezeichner Primärausdruck
arguments
darf nicht im Rumpf einer Pfeilfunktion verwendet werden (ob Ausdruck oder Blockform).Ebenso darf
yield
nicht im Körper einer Pfeilfunktion verwendet werden. Pfeile können keine Generatoren sein und wir wollen keine tiefen Fortsetzungen.
Die Ausbeute in einer Pfeil-Funktion führt zu einem semantischen Fehler: http://www.ecma-international.org/
Am Ende liegt der Grund in der tiefen Komplexität bei der Implementierung von ECMA6. C # lässt dies aus etwas ähnlichen Gründen auch nicht zu.
Zusätzlich zu der oben erwähnten Diskussion über esdiscuss.org und die Versammlungsnotizen des Ecma TC39-Komitees ES6 vom November 201 wurden die Generatorpfeile in zwei ES7-Versammlungen vom September 2016 überarbeitet [1][2] . Nach einer Diskussion über Vor- und Nachteile verschiedener Syntax (hauptsächlich =*>
und =>*
) und mangelnde Begründungen und Anwendungsfälle für dieses Feature kamen zu dem Schluss, dass:
- Das Komitee hat ein gewisses Interesse, befürchtet jedoch, dass das Feature durch das Hinzufügen einer neuen Syntax nicht an Bedeutung gewinnt
- Planen Sie einen erneuten Besuch an Tag 3, um zu sehen, ob wir
=>*
mindestens auf Stufe 0, als Teil von [Domenic Denicolas] asynchronem Iterationsvorschlag
Der Vorschlag für Generatorpfeile wurde mit Brendan Eich und Domenic Denicola als Champions auf Stufe 1 verschoben, aber ein relevantes tc39/suggestions Repo existiert noch nicht. Ich gehe davon aus, dass man auf weitere Neuigkeiten warten muss, bis der asynchrone Iterationsvorschlag für Phase 3 abgeschlossen ist.
Ich weiß, dass dies sehr spät ist, aber ein anderer möglicher Grund könnte die Syntax sein. vielleicht (*() => {})
funktioniert, aber was ist mit (9 ** () => {})
? Ist das 9 eine Pfeilfunktion, die NaN
zurückgibt, oder ist es 9-mal eine Generatorpfeilfunktion und gibt auch NaN
zurück? Es könnte mit einer alternativen Syntax ausgeführt werden, wie =>*
, wie in einer anderen Antwort hier erwähnt, aber möglicherweise bestand der Wunsch, die Konsistenz der Generatorfunktionssyntax (z. B. function* () {}
und { *genMethod() {} }
) beizubehalten, wenn sie implementiert wurde. Nicht zu viel Entschuldigung, aber ein Grund dafür.
Ich hatte auch die gleiche Frage und kam hierher. Nachdem ich die Posts und Kommentare gelesen hatte, kam mir der Einsatz des Generators in einer Pfeilfunktion als vage vor:
const generator = () => 2*3; // * implies multiplication
// so, this would be a confusing
const generator = () =>* something; // err, multiplying?
const generator = () =*> ... // err, ^^
const generator = ()*=> ... // err, *=3, still multiplying?
const generator=*()=> ... // err, ^^
const generator = *param => ... //err, "param" is not fixed Word
Dies ist möglicherweise der Hauptgrund, warum sie den Generator nicht in Verbindung mit der Pfeilfunktion implementiert haben.
Aber wenn ich einer von ihnen wäre, hätte ich so denken können:
const generator = gen param => ... // hmm, gen indicates a generator
const generator = gen () => ... // ^^
Das fühlt sich an, als hätten wir eine asynchrone Funktion:
const asyncFunction = async () => ... // pretty cool
Da bei normaler Funktion das Schlüsselwort async vorhanden ist, verwendet es die Pfeilfunktion - async () =>
scheint async function()
zu sein.
Es gibt jedoch kein Schlüsselwort wie gen
oder generator
, und leider verwendet die Pfeilfunktion diese nicht.
Schlussfolgern:
Selbst wenn sie den Generator in der Pfeilfunktion implementieren möchten, denke ich, dass sie die Generatorsyntax in Core-js überdenken müssen:
generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}
Und das wird ein großer Fehler sein. Es ist also ziemlich cool, die Pfeilfunktion außerhalb des Generators zu lassen.
Folgender @Bergi-Kommentar :
Pfeilfunktionen sollen leichtgewichtig sein (und haben beispielsweise keinen .prototyp) und oft Einzeiler, während Generatoren das Gegenteil sind.
Ich werde sagen, dass der Zweck des Generators run-stop-run ist, und ich denke nicht, dass wir uns um Prototypen, lexikalische usw. kümmern müssen.
Es gibt einen Nizza Workaround mit Redux-Saga
import { call, all } from 'redux-saga/effects';
function* gen() {
yield all([].map(() => {
return call(....);
}));
}