¿Cuál es la palabra clave de rendimiento en JavaScript?

Resuelto mck89 asked hace 14 años • 15 respuestas

Escuché acerca de una " yield" palabra clave en JavaScript. ¿Para qué se utiliza y cómo lo uso?

mck89 avatar Feb 17 '10 22:02 mck89
Aceptado

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 yieldes algo así como return: obtienes algo a cambio. return xdevuelve el valor de x, pero yield xdevuelve 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.

bishop avatar Dec 31 '2013 15:12 bishop

Es realmente simple, así es como funciona.

  • yieldLa 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
noelyahan avatar Jan 31 '2017 14:01 noelyahan