ou seja, como eu expresso isso:
function *(next) {}
com flechas. Eu tentei todas as combinações em que consegui pensar e não consigo encontrar nenhuma documentação.
(atualmente usando o nó v0.11.14)
javascript
ecmascript-6
generator
arrow-functions
Ashley Coolman
fonte
fonte
function*
declaração (palavra-chave da função seguida por um asterisco) define uma função do gerador."param*=>{ }
fazer?function(){}
não está fazendo o mesmo que()=>{}
?Respostas:
Você não pode. Desculpe.
De acordo com a MDN
De um documento de especificação (minha ênfase):
fonte
.prototype
por exemplo) e, geralmente, de uma linha, enquanto os geradores são praticamente o oposto.this
e tive que escrever olet self = this
hack para ter acesso a ele dentro do gerador. O escopo lexical + sintaxe da seta teria sido bom. Infeliz, mas não exatamente o fim do mundo.function
palavra-chave por ser uma "parte ruim" da linguagem. Existem boas razões para fazer isso. Para essas pessoas, a falta de geradores de flechas é uma inconsistência irritante.A diferença entre funções Inline e funções Arrow
Antes de tudo , as funções Arrow
() => {}
não são feitas para substituir as funções Inlinefunction(){}
e são diferentes. Funções inline são simplesmente funções, então a questão é qual é a diferença entre as funções Arrow e as funções inline.Alguns detalhes mais rápidos aqui
Por que a função Arrow não pode ser usada como geradores
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Note que geradores sem
yield
não fazem sentido.Por que a função Arrow não pode usar rendimento
http://tc39wiki.calculist.org/es6/arrow-functions/
O rendimento em uma função de seta gerará erro semântico: http://www.ecma-international.org/
No final, o motivo está na profunda complexidade na implementação do ECMA6. O C # não permite isso também por razões um tanto semelhantes .
fonte
()=>{}
ajudaria muito, entender sua diferença de uma função em linha e por que a limitação existe para os geradores.*() => { yield bla; }
não é ok, masasync () => { await bla; }
é ...Além da discussão em esdiscuss.org e das notas de reunião ES6 do comitê Ecma TC39 de novembro de 2013 mencionadas acima, as setas do gerador foram revisadas em duas reuniões ES7 de setembro de 2016 [1] [2] . Após uma discussão sobre prós e contras de várias sintaxes (principalmente
=*>
e=>*
) e uma falta de justificativas e casos de uso para esse recurso, eles chegaram à conclusão de que:A proposta de flechas geradoras foi movida para o Estágio 1, com Brendan Eich e Domenic Denicola como campeões. A iteração assíncrona mencionada acima foi concluída e implementada em 2018.
Em outubro de 2019, um repo oficial de Sergey Rubanov apareceu com mais discussão sobre sintaxe e outros detalhes.
fonte
Eu também estava tendo a mesma pergunta e vim aqui. Depois de ler as postagens e comentários, senti que usar o gerador em uma função de seta parece ser vago:
Este é o motivo pelo qual eles não implementaram o gerador em relação à função de seta.
Mas, se eu fosse um deles, poderia ter pensado assim:
Parece que temos a função assíncrona:
Como, com a função normal, a palavra - chave assíncrona existe, a função de seta a está utilizando -
async () =>
é provável que pareçaasync function()
.Mas, não existe palavra-chave como
gen
ougenerator
e, infelizmente, a função de seta não a está usando.Concluir:
Mesmo que eles desejem implementar o gerador na função de seta, acho que precisam repensar a sintaxe do gerador no núcleo js:
E isso será um grande erro. Portanto, manter a função da seta fora do gerador é muito legal.
Seguindo o comentário da @Bergi :
Eu direi que o propósito do gerador a ser usado é executar, parar, executar e, portanto, acho que não precisamos nos preocupar com protótipos, lexicais, etc.
fonte
() ~> { yield 'a'; yield 'b'; }
. Para ser sincero, adoro tildes.Eu sei que isso é muito tarde, mas outro possível motivo pode ser a sintaxe. talvez
(*() => {})
funcione, mas e quanto(9 ** () => {})
? Isso é 9 ao poder de uma função de seta, retornandoNaN
, ou 9 vezes uma função de seta de gerador, também retornandoNaN
? Isso poderia ser feito com alguma sintaxe alternativa, como=>*
mencionado em outra resposta aqui, mas talvez houvesse um desejo de preservar a consistência da sintaxe da função do gerador (por exemplo,function* () {}
e{ *genMethod() {} }
) quando ela estava sendo implementada. Não é uma desculpa demais, mas uma razão para isso.fonte
No momento, você não pode, mas no futuro pode ser porque a TC39 libera a proposta para o mesmo em outubro de 2019, que está no estágio 1.
fonte
Existe uma boa solução alternativa com redux-saga
fonte