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)
7 answers
Nie możesz.Czy Mogę używać składni funkcji arrow ES6 z generatorami?
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 "}"
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
, lubnew.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, bindreturn
W przypadku bloku Body case, więc zwraca się z natychmiastowej funkcji Strzałki i wykluczabreak
icontinue
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 .
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.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.
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.
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.
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(....);
}));
}
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