wake-up-neo.com

Kann ich die Pfeilfunktionssyntax von ES6 mit Generatoren verwenden? (Pfeilnotation)

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)

171
Ashley Coolman

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 "}"
154
user663031

Der Unterschied zwischen Inline-Funktionen und Pfeil-Funktionen

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 oder new.target). Pfeilfunktionen sind immer anonym.

Noch ein paar schnelle Details hier


Warum kann die Arrow-Funktion nicht als Generatoren verwendet werden

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.


Warum kann die Pfeil-Funktion den Ertrag nicht verwenden

http://tc39wiki.calculist.org/es6/arrow-functions/

Pfeilfunktionen binden this lexikalisch, binden return im Körperkörper Block so, dass sie von der unmittelbar einschließenden Pfeilfunktion zurückkehren und break und continue 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.

96
CoderPi

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.

24
monk-time

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.

2
coolreader18

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.

1

Es gibt einen Nizza Workaround mit Redux-Saga

import { call, all } from 'redux-saga/effects';

function* gen() {
   yield all([].map(() => {
      return call(....);
   }));
}