Czy Mogę używać składni funkcji arrow ES6 z generatorami? (zapis strzałkowy)

Ie Jak to wyrazić:

function *(next) {}

Ze składnią strzałek. Próbowałem wszystkich kombinacji, które mogłem wymyślić, i nie mogę znaleźć żadnej dokumentacji na ten temat.

(obecnie używa node v0.11.14)

Author: Ashley Coolman, 2014-12-26

7 answers

Czy Mogę używać składni funkcji arrow ES6 z generatorami?

Nie możesz.

Według MDN

Instrukcja function* (function, po której następuje gwiazdka) definiuje funkcję generatora.

From a Spec document (moje podkreślenie):

Składnia funkcji jest rozszerzona o opcjonalny token *:

FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" 
  "{" FunctionBody "}"
 259
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 13:05:35

Różnica między funkcjami Inline i funkcjami strzałek

Po pierwsze Strzałka-funkcje () => {} nie są stworzone do zastępowania funkcji Inline function(){} i są różne. Funkcje Inline są po prostu funkcjami, więc pytanie brzmi, jaka jest różnica między funkcjami Arrow i funkcjami Inline.

Wyrażenie funkcji strzałki (znane również jako funkcja strzałki) ma krótszą składnię w porównaniu do wyrażeń funkcji i nie wiąże własnych this, arguments, super, lub new.target). Funkcje strzałek są zawsze anonimowe.

Kilka szybkich szczegółów tutaj


Dlaczego funkcja Arrow nie może być używana jako generatory

Https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Użycie słowa kluczowego yield

Słowo kluczoweyield nie może być używane w ciele funkcji strzałki (z wyjątkiem sytuacji, gdy jest to dozwolone w funkcjach zagnieżdżonych dalej w jej obrębie). W konsekwencji funkcje strzałek nie mogą być używane jako generatory.

Zauważ, że Generatory BEZ yield nie mają sensu.


Dlaczego funkcja Arrow nie może używać yield

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

Funkcje strzałek bind this leksykalnie, bind return W przypadku bloku Body case, więc zwraca się z natychmiastowej funkcji Strzałki i wyklucza break i continue z odwoływanie się do wypowiedzi poza funkcją strzałki.

Identyfikator wyrażenie podstawowe arguments nie może być używany w ciele funkcji strzałki (wyrażenie lub forma blokowa).

Podobnie, yield nie może być używany w ciele funkcji strzałki. Strzałki nie mogą być generatorami i nie chcemy głębokich ciągów.

Yield w strzałce-funkcja wyrzuci błąd semantyczny: http://www.ecma-international.org/

W Koniec powodem jest głęboka złożoność wdrażania ECMA6. C# nie pozwala na to również z podobnych powodów .

 144
Author: CoderPi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Oprócz dyskusji na temat esdiscuss.org i notatki z posiedzenia Komitetu Ecma TC39 ES6 z listopada 2013 r. wspomniane powyżej Generatory strzałek zostały ponownie omówione podczas dwóch wrześniowych spotkań ES7[1] [2]. Po dyskusji na temat zalet i wad różnych składni (głównie =*> i =>*) oraz braku uzasadnień i przypadków użycia dla tej funkcji, doszli do wniosku, że:

  • jest pewne zainteresowanie ze strony w przeciwieństwie do poprzednich wersji, nie jest on w pełni funkcjonalny i nie jest w pełni funkcjonalny.]} Planujemy wrócić do trzeciego dnia, aby zobaczyć, czy uda nam się dostać =>* do etapu 0 przynajmniej, jako część propozycji iteracji asynchronicznej [Domenic Denicola] [16]}

Propozycja generatora strzałek została przeniesiona do etapu 1 z Brendanem Eichem i Domenicem Denicolą jako mistrzami. wspomniana wyżej iteracja asynchroniczna została ukończona i zaimplementowana w 2018 roku.

W październiku 2019 r.ukazał się oficjalny repo autorstwa Sergeya Rubanowa z większą dyskusją na temat składni i innych szczegółów.
 45
Author: monk-time,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-31 11:36:39

Ja też miałem to samo pytanie i przyszedłem tutaj. Po przeczytaniu postów i komentarzy czułem, że użycie generatora w funkcji strzałki wydaje się niejasne:

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

To może być powodem, dla którego Nie zaimplementowano generatora w związku z funkcją arrow.


Ale gdybym był jednym z nich, mógłbym tak myśleć:

const generator = gen param => ... // hmm, gen indicates a generator
const generator = gen () => ... // ^^

Wygląda to tak, jakbyśmy mieli funkcję asynchroniczną:

const asyncFunction = async () => ... // pretty cool

Ponieważ z funkcją normalną asynchroniczna słowo kluczowe istnieje, więc używa Go funkcja arrow - async () => może wydawać się async function().

Ale nie ma takiego słowa kluczowego jak gen lub generator i niestety funkcja arrow go nie używa.

Na zakończenie:

Nawet jeśli chcą zaimplementować generator w funkcji arrow, myślę, że muszą przemyśleć składnię generatora w core js:

generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}
A to będzie wielki błąd. Więc trzymanie funkcji strzałek z generatora jest całkiem fajne.

Po @Bergi komentarz :

Nie. Funkcje strzałek mają być lekkie (i nie mająprototyp na przykład) i często Jednowierszowe, podczas gdy generatory są prawie odwrotnie.

Powiem, że celem generatora jest run-stop-run i nie sądzę, że musimy dbać o prototyp, leksykę itp.

 7
Author: Bhojendra Rauniyar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-01 16:18:21

W tej chwili nie możesz, ale w przyszłości możesz być, ponieważ tc39 wyda propozycję dla tego samego w październiku 2019, który jest w etapie 1.

 3
Author: Gourav Makhija,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-24 17:08:03

Wiem, że to bardzo późno, ale innym możliwym powodem może być składnia. może (*() => {}) działa, ale co z (9 ** () => {})? Czy jest to 9 do potęgi funkcji strzałki, zwracającej NaN, czy jest to 9-krotna funkcja strzałki generatora, zwracająca również NaN? Można to zrobić za pomocą jakiejś alternatywnej składni, jak np. =>* Jak wspomniano w innej odpowiedzi tutaj, ale być może istniała chęć zachowania spójności składni funkcji generatora (np. function* () {} i { *genMethod() {} }), Kiedy był wdrażany. Nie zbyt wymówka, ale powód.

 2
Author: coolreader18,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-23 17:25:28

Jest ładne obejście z redux-saga

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

function* gen() {
   yield all([].map(() => {
      return call(....);
   }));
}
 -5
Author: Julius Baltrušaitis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-11 12:58:58