c'est-à-dire comment exprimer ceci:
function *(next) {}
avec des flèches. J'ai essayé toutes les combinaisons auxquelles je pouvais penser et je ne trouve aucune documentation à ce sujet.
(utilise actuellement le nœud v0.11.14)
javascript
ecmascript-6
generator
arrow-functions
Ashley Coolman
la source
la source
function*
instruction (mot-clé de fonction suivi d'un astérisque) définit une fonction de générateur."param*=>{ }
faire?function(){}
n'est pas la même chose que()=>{}
?Réponses:
Tu ne peux pas. Désolé.
Selon MDN
À partir d'un document de spécification (c'est moi qui souligne):
la source
.prototype
par exemple) et souvent à une ligne, tandis que les générateurs sont à peu près le contraire.this
, et j'ai dû écrire lelet self = this
hack pour y accéder à l'intérieur du générateur. La syntaxe lexicale portée + flèche aurait été bien. Malheureux, mais pas exactement la fin du monde.function
mot - clé comme étant une «mauvaise partie» du langage. Il y a de bonnes raisons de le faire. Pour ces personnes, le manque de générateurs de flèches est une incohérence gênante.La différence entre les fonctions en ligne et les fonctions fléchées
Tout d'abord fonctions Flèche
() => {}
ne sont pas conçues pour remplacer les fonctions Inlinefunction(){}
et elles sont différentes. Les fonctions en ligne sont simplement des fonctions, la question est donc de savoir quelle est la différence entre les fonctions fléchées et les fonctions en ligne.Quelques détails plus rapides ici
Pourquoi la fonction flèche ne peut pas être utilisée comme générateur
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Notez que les générateurs sans
yield
n'ont aucun sens.Pourquoi la fonction flèche ne peut pas utiliser le rendement
http://tc39wiki.calculist.org/es6/arrow-functions/
Le rendement dans une fonction fléchée générera une erreur sémantique: http://www.ecma-international.org/
En fin de compte, la raison réside dans la complexité profonde de la mise en œuvre d'ECMA6. C # ne le permet pas également pour des raisons quelque peu similaires .
la source
()=>{}
aiderait beaucoup, pour comprendre sa différence par rapport à une fonction en ligne, et pourquoi la limitation est là pour les générateurs.*() => { yield bla; }
va pas, maisasync () => { await bla; }
est ...Outre la discussion sur esdiscuss.org et les notes de réunion ES6 du comité Ecma TC39 de novembre 2013 mentionnées ci-dessus, les flèches du générateur ont été revues lors de deux réunions ES7 de septembre 2016 [1] [2] . Après une discussion sur les avantages et les inconvénients des différentes syntaxes (principalement
=*>
et=>*
) et le manque de justifications et de cas d'utilisation pour cette fonctionnalité, ils sont arrivés à la conclusion que:La proposition de flèches de générateur a été déplacée à l' étape 1 avec Brendan Eich et Domenic Denicola comme champions. L'itération asynchrone mentionnée ci-dessus a été terminée et mise en œuvre en 2018.
En octobre 2019, un dépôt officiel de Sergey Rubanov est apparu avec plus de discussions sur la syntaxe et d'autres détails.
la source
J'avais aussi la même question et je suis venu ici. Après avoir lu les articles et les commentaires, j'ai senti que l'utilisation du générateur dans une fonction de flèche semblait vague:
C'est peut-être la principale raison pour laquelle ils n'ont pas implémenté le générateur en relation avec la fonction flèche.
Mais, si j'étais l'un d'eux, j'aurais pu penser comme ceci:
Cela ressemble à la fonction asynchrone:
Parce que, avec une fonction normale, le mot-clé async existe, donc la fonction flèche l'utilise -
async () =>
semble probableasync function()
.Mais, il n'y a pas de mot-clé comme
gen
ougenerator
et hélas la fonction de flèche ne l'utilise pas.De conclure:
Même s'ils souhaitent implémenter le générateur dans la fonction flèche, je pense qu'ils doivent repenser la syntaxe du générateur dans le noyau js:
Et ce sera une grosse erreur. Donc, garder la fonction de flèche hors du générateur est plutôt cool.
Suite au commentaire @Bergi :
Je dirai que le but du générateur à utiliser est run-stop-run et donc je ne pense pas que nous devons nous soucier du prototype, du lexical, etc.
la source
() ~> { yield 'a'; yield 'b'; }
. Pour être honnête, j'adore les tildes.Je sais que c'est très tard, mais une autre raison possible pourrait être la syntaxe.
(*() => {})
fonctionne peut-être , mais qu'en est-il(9 ** () => {})
? Est-ce 9 à la puissance d'une fonction flèche, qui revientNaN
, ou est-ce 9 fois la fonction flèche d'un générateur, qui revient égalementNaN
? Cela pourrait être fait avec une syntaxe alternative, comme=>*
mentionné par une autre réponse ici, mais peut-être qu'il y avait un désir de préserver la cohérence de la syntaxe de la fonction du générateur (par exemple.function* () {}
Et{ *genMethod() {} }
) lors de sa mise en œuvre. Pas trop d'excuse, mais une raison.la source
Pour le moment, vous ne pouvez pas, mais à l'avenir, vous pourriez l'être parce que la proposition de publication de TC39 pour la même chose en octobre 2019, qui est à l'étape 1.
la source
Il y a une bonne solution de contournement avec redux-saga
la source