Nuestros mejores investigadores han agotado sus reservas de café, investigando noche y día por la respuesta, hasta que Antonio halló la contestación en Gitea y hoy la compartimos con nosotros.
Solución:
Respuesta tardía, probablemente todos lo sepan 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:
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 brinda 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.
La documentación de MDN es bastante buena, en mi opinión.
La función que contiene la palabra clave yield es un generador. Cuando lo llama, sus parámetros formales están vinculados a argumentos reales, pero su cuerpo no se evalúa realmente. En su lugar, se devuelve un generador-iterador. Cada llamada al método next() del generador-iterador realiza otro paso a través del algoritmo iterativo. El valor de cada paso es el valor especificado por la palabra clave yield. Piense en yield como la versión generador-iterador de return, que indica el límite entre cada iteración del algoritmo. Cada vez que llama a next(), el código del generador se reanuda a partir de la declaración que sigue al rendimiento.
Es muy simple, así es como funciona
yield
palabra clave simplemente ayuda a pausa y reanudar una función en cualquier momento asincrónicamente.- Adicionalmente ayuda a valor devuelto a partir de una función de generador.
Toma esto simple generador función:
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 llames al _proceso.siguiente() eso no lo hará ejecutar el primeras 2 lineas de código, entonces el primer rendimiento voluntad pausa la función. Para reanudar la función hasta el próximo pausa punto (palabra clave de rendimiento) tienes que llamar _proceso.siguiente().
Puedes pensar varias rendimientos son los puntos de interrupción en un depurador de javascript dentro de una sola función. Hasta que le diga que navegue por el siguiente punto de interrupción, no ejecutará el bloque de código. (Nota: sin bloquear toda la aplicación)
Pero mientras yield realiza esta pausa y reanuda los comportamientos, puede devolver algunos resultados así como value: any, done: boolean
de acuerdo con la función anterior no hemos emitido ningún valor. Si exploramos la salida anterior, mostrará lo mismo value: undefined, done: false
con valor indefinido.
Profundicemos en la palabra clave yield. Opcionalmente puedes agregar expresión y establecer asignar un valor opcional predeterminado. (sintaxis del documento oficial)
[rv] = yield [expression];
expresión: Valor a devolver de la función generadora
yield any;
yield age: 12;
autocaravana: Devuelve el valor opcional que pasó al método next() del generador
Simplemente puede pasar parámetros a la función procesar () 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 asíncronos
Referencias:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield
- http://javascript.tutorialhorizon.com/2015/09/16/generadores-y-rendimiento-en-es6/
- https://strongloop.com/strongblog/how-to-generators-node-js-yield-use-cases/
Si conservas alguna desconfianza o capacidad de prosperar nuestro ensayo puedes escribir una crítica y con gusto lo estudiaremos.