Escuché sobre una palabra clave de "rendimiento" en JavaScript, pero encontré muy poca documentación al respecto. ¿Alguien puede explicarme (o recomendar un sitio que explique) su uso y para qué se utiliza?
javascript
yield
keyword
mck89
fuente
fuente
Respuestas:
La documentación de MDN es bastante buena, en mi opinión.
fuente
Respuesta tardía, probablemente todo el mundo lo sepa
yield
ahora, pero ha aparecido una mejor documentación.Adaptando un ejemplo de "Javascript's Future: Generators" de James Long para el estándar oficial de Harmony:
Entonces
yield
es algo así comoreturn
: recuperas algo.return x
devuelve el valor dex
, peroyield x
devuelve una función, que le brinda un método para iterar hacia el siguiente valor. Es útil si tiene un procedimiento potencialmente intensivo en memoria que puede querer interrumpir durante la iteración.fuente
function* foo(x){
allí*
. Si lo necesita o no, depende del tipo de futuro que regrese. El detalle es largo: GvR lo explica para la implementación de Python , sobre el cual se modela la implementación de Javascript. El usofunction *
siempre será correcto, aunque en algunos casos un poco más sobrecargado quefunction
conyield
.function *
yyield
, y agregó el error citado ("Se genera un error temprano si se produce una expresión de rendimiento o rendimiento * en una función no generadora"). Pero, la implementación original de Javascript 1.7 en Firefox no requería el*
. Respuesta actualizada en consecuencia. ¡Gracias!Es realmente simple, así es como funciona
yield
La palabra clave simplemente ayuda a pausar y reanudar una función en cualquier momento de forma asincrónica .Tome esta sencilla función de generador :
Hasta que llame la _process.next () se planteo ejecutar las 2 primeras líneas de código, a continuación, la primera cosecha será pausar la función. Para reanudar la función hasta el siguiente punto de pausa ( palabra clave de rendimiento ), debe llamar a _process.next () .
Pero mientras que los comportamientos de rendimiento Realiza esta pausa y reanudar puede devolver algunos resultados así
{value: any, done: boolean}
de acuerdo a la función anterior no hemos emitir cualquier valor. Si exploramos la salida anterior, mostrará lo mismo{ value: undefined, done: false }
con un valor indefinido .Vamos a profundizar en la palabra clave de rendimiento. Opcionalmente, puede agregar expresión y establecer asignar un valor opcional predeterminado . (Sintaxis oficial del documento)
expresión : Valor a devolver de la función generadora
rv : devuelve el valor opcional que pasó al método next () del generador
Pruebalo ahora
Usos
Referencias
fuente
Simplificando / elaborando la respuesta de Nick Sotiros (que creo que es increíble), creo que es mejor describir cómo comenzaría a codificar
yield
.En mi opinión, la mayor ventaja de usar
yield
es que eliminará todos los problemas de devolución de llamada anidados que vemos en el código. Al principio es difícil ver cómo, por eso decidí escribir esta respuesta (¡para mí y, con suerte, para los demás!)La forma en que lo hace es introduciendo la idea de una co-rutina, que es una función que puede detener / pausar voluntariamente hasta que obtenga lo que necesita. En javascript, esto se denota por
function*
. Solo lasfunction*
funciones pueden usaryield
.Aquí hay algunos javascript típicos:
Esto es torpe porque ahora todo su código (que obviamente necesita esperar esta
loadFromDB
llamada) debe estar dentro de esta devolución de llamada fea. Esto es malo por algunas razones ...})
que debes seguir en todas partesfunction (err, result)
jerga extraresult
Por otro lado, con
yield
todo esto se puede hacer en una línea con la ayuda del agradable marco de co-rutina.Y ahora, su función principal cederá cuando sea necesario cuando necesite esperar a que se carguen las variables y las cosas. Pero ahora, para ejecutar esto, debe llamar a una función normal (no corutina). Un marco de co-rutina simple puede solucionar este problema, de modo que todo lo que tiene que hacer es ejecutar esto:
Y el inicio está definido (de la respuesta de Nick Sotiro)
Y ahora, puede tener un código hermoso que es mucho más legible, fácil de eliminar y no necesita manipular sangrías, funciones, etc.
Una observación interesante es que, en este ejemplo, en
yield
realidad es solo una palabra clave que puede poner antes de una función con una devolución de llamada.Imprimiría "Hola Mundo". Por lo tanto, puede convertir cualquier función de devolución de llamada en
yield
simplemente creando la misma firma de función (sin el cb) y regresandofunction (cb) {}
, de esta manera:Espero que con este conocimiento pueda escribir un código más limpio y legible que sea fácil de eliminar .
fuente
function*
es solo una función regular sin rendimiento?function *
es una función que contiene rendimiento. Es una función especial llamada generador.yield
todas partes, estoy seguro de que esto tiene más sentido que las devoluciones de llamada, pero no veo cómo esto es más legible que las devoluciones de llamada.Para dar una respuesta completa:
yield
está funcionando de manera similarreturn
, pero en un generador.En cuanto al ejemplo comúnmente dado, esto funciona de la siguiente manera:
Pero también hay un segundo propósito de la palabra clave de rendimiento. Se puede usar para enviar valores al generador.
Para aclarar, un pequeño ejemplo:
Esto funciona, ya que
2
se le asigna el valory
, enviándolo al generador, después de que se detuvo en el primer rendimiento (que regresó0
).Esto nos permite hacer algunas cosas realmente funky. (buscar corutina)
fuente
Se usa para generadores iteradores. Básicamente, le permite hacer una secuencia (potencialmente infinita) usando código de procedimiento. Ver la documentación de Mozilla .
fuente
yield
También se puede utilizar para eliminar el infierno de devolución de llamada, con un marco de trabajo de rutina.fuente
Generador de secuencia de Fibonacci usando la palabra clave de rendimiento.
fuente
Yeild
la palabra clave en la función javaScript lo hace generador,¿Qué es el generador en JavaScript?
Lo que significa que los generadores nos ayudan a trabajar de forma asíncrona con los iteradores de ayuda. ¿Ahora qué son los iteradores de pirateo? ¿De Verdad?
¿desde dónde el iterador nos ayuda a acceder al elemento uno a la vez? nos ayuda a acceder a los elementos a través de las funciones del generador,
las funciones generadoras son aquellas en las que usamos
yeild
palabras clave, la palabra clave de rendimiento nos ayuda a pausar y reanudar la ejecución de la funciónAquí hay un ejemplo rápido
déjame explicar brevemente lo que está pasando
notó que la ejecución se detiene en cada
yeild
palabra clave y podemos acceder primeroyield
con la ayuda del iterador.next()
esto itera a todas las
yield
palabras clave una a la vez y luego regresa indefinido cuando noyield
quedan más palabras clave en palabras simples, puede decir que layield
palabra clave es el punto de interrupción donde la función se detiene cada vez y solo se reanuda cuando se llama usando el iteradorpara nuestro caso:
_getMeDrink.next()
este es un ejemplo de iterador que nos está ayudando a acceder a cada punto de interrupción en la funciónEjemplo de generadores:
async/await
si ves la implementación de
async/await
verásgenerator functions & promises
se utilizan para hacer elasync/await
trabajopor favor señale cualquier sugerencia es bienvenida
fuente
Dependencia entre llamadas async javascript.
Otro buen ejemplo de cómo se puede usar el rendimiento.
fuente
Antes de aprender sobre el rendimiento, necesita saber sobre los generadores. Los generadores se crean utilizando la
function*
sintaxis. Las funciones del generador no ejecutan código, sino que devuelve un tipo de iterador llamado generador. Cuando se da un valor usando elnext
método, la función de generador se sigue ejecutando hasta que se encuentra con una palabra clave de rendimiento. El usoyield
le devuelve un objeto que contiene dos valores, uno es valor y el otro está hecho (booleano). El valor puede ser una matriz, un objeto, etc.fuente
Un simple ejemplo:
fuente
También estoy tratando de entender la palabra clave de rendimiento. Según mi comprensión actual, en el generador, la palabra clave de rendimiento funciona como un cambio de contexto de CPU. Cuando se ejecuta la declaración de rendimiento, se guardan todos los estados (por ejemplo, variables locales).
Además de esto, se devolverá un objeto de resultado directo a la persona que llama, como {valor: 0, hecho: falso}. La persona que llama puede usar este objeto de resultado para decidir si 'reactiva' el generador nuevamente llamando a next () (llamar a next () es repetir la ejecución).
Otra cosa importante es que puede establecer un valor en una variable local. La persona que llama 'next ()' puede pasar este valor al 'despertar' el generador. por ejemplo, it.next ('valueToPass'), como este: "resultValue = yield slowQuery (1);" Al igual que cuando se activa una próxima ejecución, la persona que llama puede inyectar algún resultado en ejecución a la ejecución (inyectándolo en la variable local). Por lo tanto, para esta ejecución, hay dos tipos de estado:
El contexto que se guardó en la última ejecución.
Los valores inyectados por el disparador de esta ejecución.
Entonces, con esta característica, el generador puede ordenar múltiples operaciones asíncronas. El resultado de la primera consulta asincrónica se pasará a la segunda configurando la variable local (resultValue en el ejemplo anterior). La segunda consulta asíncrona solo puede ser activada por la respuesta de la primera consulta asíncrona. Luego, la segunda consulta asíncrona puede verificar el valor de la variable local para decidir los próximos pasos porque la variable local es un valor inyectado de la respuesta de la primera consulta.
Las dificultades de las consultas asíncronas son:
devolución de llamada infierno
perder de contexto a menos que los pase como parámetros en la devolución de llamada.
el rendimiento y el generador pueden ayudar en ambos.
Sin rendimiento y generador, para ordenar múltiples consultas asíncronas requiere devolución de llamada anidada con parámetros como contexto que no es fácil de leer y mantener.
A continuación se muestra un ejemplo de consultas asíncronas encadenadas que se ejecuta con nodejs:
A continuación se muestra el resultado de ejecución:
+++++++++++ start +++++++++++
consulta1 0
+++++++++++ end +++++++++++
query2 1
consulta4 0
El siguiente patrón de estado puede hacer lo mismo para el ejemplo anterior:
El siguiente es el resultado de ejecución:
+++++++++++ start +++++++++++
consulta1 0
+++++++++++ end +++++++++++
query2 1
consulta4 0
fuente
no olvide la útil sintaxis 'x of generator' para recorrer el generador. No es necesario utilizar la función next () en absoluto.
fuente