¿Cuál es la palabra clave de rendimiento en JavaScript?
Escuché acerca de una " yield
" palabra clave en JavaScript. ¿Para qué se utiliza y cómo lo uso?
Adaptando un ejemplo de "Javascript's Future: Generators" de James Long para el estándar oficial de Harmony:
function * foo(x) {
while (true) {
x = x * 2;
yield x;
}
}
"Cuando llamas a foo, obtienes un objeto Generador que tiene un método siguiente".
var g = foo(2);
g.next(); // -> 4
g.next(); // -> 8
g.next(); // -> 16
Entonces yield
es algo así como return
: obtienes algo a cambio. return x
devuelve el valor de x
, pero yield x
devuelve una función, que le proporciona un método para iterar hacia el siguiente valor. Útil si tiene un procedimiento potencialmente intensivo en memoria que quizás desee interrumpir durante la iteración.
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 .- Además, ayuda a devolver valor de una función generadora .
Tome esta función generadora simple:
function* process() {
console.log('Start process 1');
console.log('Pause process2 until call next()');
yield;
console.log('Resumed process2');
console.log('Pause process3 until call next()');
let parms = yield {age: 12};
console.log("Passed by final process next(90): " + parms);
console.log('Resumed process3');
console.log('End of the process function');
}
let _proceso = proceso();
Hasta que llame a _process.next(), no ejecutará las primeras 2 líneas de código, luego el primer rendimiento pausará la función. Para reanudar la función hasta el siguiente punto de pausa ( palabra clave de rendimiento ), debe llamar a _process.next() .
Puedes pensar que los rendimientos múltiples son los puntos de interrupción en un depurador de JavaScript dentro de una sola función. Hasta que le indique navegar por el siguiente punto de interrupción, no ejecutará el bloque de código. ( Nota : sin bloquear toda la aplicación)
Pero aunque el rendimiento realiza estos comportamientos de pausa y reanudación , también puede devolver algunos resultados{value: any, done: boolean}
, de acuerdo con la función anterior, no hemos emitido ningún valor. Si exploramos el resultado anterior, mostrará lo mismo { value: undefined, done: false }
con el valor indefinido .
Profundicemos en la palabra clave de rendimiento. Opcionalmente, puede agregar una expresión y establecer asignar un valor opcional predeterminado . (Sintaxis oficial del documento)
[rv] = yield [expression];
expresión : Valor a devolver de la función generadora
yield any;
yield {age: 12};
rv : Devuelve el valor opcional que pasó al método next() del generador.
Simplemente puede pasar parámetros a la función Process() con este mecanismo, para ejecutar diferentes partes de rendimiento.
let val = yield 99;
_process.next(10);
now the val will be 10
Pruebalo ahora
Usos
- Evaluación perezosa
- secuencias infinitas
- Flujos de control asincrónicos
Referencias:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield
- http://javascript.tutorialhorizon.com/2015/09/16/generators-and-yield-in-es6/
- https://strongloop.com/strongblog/how-to-generators-node-js-yield-use-cases/
- https://medium.com/vptech/a-practical-introduction-to-constraint-programming-2037c91833ba