es decir, cómo expreso esto:
function *(next) {}
con flechas He probado todas las combinaciones que se me ocurren, y no puedo encontrar ninguna documentación al respecto.
(actualmente usando el nodo v0.11.14)
javascript
ecmascript-6
generator
arrow-functions
Ashley Coolman
fuente
fuente
function*
declaración (palabra clave de función seguida de un asterisco) define una función generadora".param*=>{ }
hacer?function(){}
no está haciendo lo mismo que()=>{}
?Respuestas:
No puedes Lo siento.
De acuerdo con MDN
De un documento de especificaciones (mi énfasis):
fuente
.prototype
por ejemplo) y, a menudo, de una sola línea, mientras que los generadores son todo lo contrario.this
, y tuve que escribir ellet self = this
truco para acceder dentro del generador. El alcance léxico + sintaxis de flecha hubiera sido bueno. Desafortunado, pero no exactamente el fin del mundo.function
palabra clave para que sea una "parte mala" del lenguaje. Hay buenas razones para hacer esto. Para estas personas, la falta de generadores de flechas es una inconsistencia molesta.La diferencia entre las funciones en línea y las funciones de flecha
En primer lugar , las funciones de flecha
() => {}
no están hechas para reemplazar las funciones en líneafunction(){}
y son diferentes. Las funciones en línea son simplemente funciones, por lo que la pregunta es cuál es la diferencia entre las funciones de flecha y las funciones en línea.Algunos detalles más rápidos aquí
Por qué la función de flecha no se puede usar como generador
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Tenga en cuenta que los generadores sin
yield
no tienen sentido.Por qué la función de flecha no puede usar el rendimiento
http://tc39wiki.calculist.org/es6/arrow-functions/
El rendimiento en una función de flecha arrojará un error semántico: http://www.ecma-international.org/
Al final, la razón está en la profunda complejidad en la implementación de ECMA6. C # no permite esto también por razones algo similares .
fuente
()=>{}
ayudaría mucho, comprender su diferencia con respecto a una función en línea, y por qué la limitación existe para los generadores.*() => { yield bla; }
no está bien, peroasync () => { await bla; }
es ...Además de la discusión en esdiscuss.org y las notas de la reunión ES6 del comité Ecma TC39 de noviembre de 2013 mencionadas anteriormente, las flechas generadoras fueron revisadas en dos reuniones ES7 de septiembre de 2016 [1] [2] . Después de una discusión sobre los pros y los contras de varias sintaxis (principalmente
=*>
y=>*
) y la falta de justificaciones y casos de uso para esta característica, llegaron a la conclusión de que:La propuesta de flechas generadoras se trasladó a la Etapa 1 con Brendan Eich y Domenic Denicola como campeones. La iteración asincrónica mencionada anteriormente se terminó e implementó en 2018.
En octubre de 2019 apareció un repositorio oficial de Sergey Rubanov con más discusión sobre la sintaxis y otros detalles.
fuente
También tenía la misma pregunta y vine aquí. Después de leer las publicaciones y los comentarios, sentí que usar el generador en una función de flecha parece ser vago:
Esta es la razón por la que no implementaron el generador en relación con la función de flecha.
Pero, si fuera uno de ellos, podría haber pensado así:
Esto se siente como si tuviéramos una función asincrónica:
Porque, con la función normal, la palabra clave asíncrona existe, por lo que
async () =>
es probable que la función de flecha la esté utilizandoasync function()
.Pero, no hay una palabra clave como
gen
ogenerator
y, por desgracia, la función de flecha no la está usando.Para concluir:
Incluso si desean implementar el generador en la función de flecha, creo que necesitan repensar la sintaxis del generador en el núcleo js:
Y esto será un gran error. Por lo tanto, mantener la función de flecha fuera del generador es bastante bueno.
Siguiendo el comentario de @Bergi :
Diré que el propósito del generador para usar es run-stop-run y, por lo tanto, no creo que debamos preocuparnos por el prototipo, esto léxico, etc.
fuente
() ~> { yield 'a'; yield 'b'; }
. Para ser honesto, me encanta tildes.Sé que esto es muy tarde, pero otra posible razón podría ser la sintaxis. tal vez
(*() => {})
funciona, pero ¿qué pasa(9 ** () => {})
? ¿Eso es 9 a la potencia de una función de flecha, que regresaNaN
, o es 9 veces una función de flecha del generador, que también regresaNaN
? Podría hacerse con alguna sintaxis alternativa,=>*
como se menciona en otra respuesta aquí, pero tal vez hubo un deseo de preservar la coherencia de la sintaxis de la función del generador (por ejemplo,function* () {}
y{ *genMethod() {} }
) cuando se implementó. No es una gran excusa, sino una razón para ello.fuente
En este momento no puede, pero en el futuro podría ser debido a la propuesta de lanzamiento de TC39 para el mismo en octubre de 2019, que se encuentra en la etapa 1.
fuente
Hay una buena solución con redux-saga
fuente