Iagovar - Javascript: Generadores con yield

Javascript: Generadores con yield

Yield ayuda a generar funciones que se pueden pausar y reanudar constantemente.

Las funciones generadoras nos permiten pausar y reanudar una función cada vez que ejecuten yield y sean llamadas.

Como ejemplo, supongamos que queremos replicar la función de auto-incrementar una clave en SQL con JavaScript. Podemos hacer algo así.


function* generarId() {
// Genera un identificador consecutivo, como un autoincrement en SQLite
// Ojo al "*" en la notación después de "function"

  let identificador = 0;

  // Sin un bucle la ejecución en la segunda llamada se dentrá al final
  // de la función
  while (true) {
    identificador++;

    // Devuelve y detiene la ejecución hasta próxima llamada
    yield identificador;  

    // Condición para finalizar el bucle y la función
    if (identificador >= 10) { return }
  }
}

let variable = generarId();

console.log(variable.next())
console.log(variable.next().value)
console.log(variable.next().value)
console.log(variable.next().done)
console.log(variable.next().done)
console.log(variable.next())
console.log(variable.next())
console.log(variable.next())
console.log(variable.next())
console.log(variable.next())
console.log(variable.next())
console.log(variable.next())

/* Esto es lo que muestra la consola:

Object { done:false,value:1 }
2
3
false
false
Object { done:false,value:6 }
Object { done:false,value:7 }
Object { done:false,value:8 }
Object { done:false,value:9 }
Object { done:false,value:10 }
Object { done:true,value:undefined }
Object { done:true,value:undefined }

*/

Juega con el código

Básicamente esta función contiene un bucle infinito, cada vez que se ejecuta yield devuelve un valor, y cada vez que se llama a la función, se reanuda desde la siguiente línea al yield, en este caso busca una condición, si se cumple finaliza la función (y lo muestra con done: true al ser llamada de nuevo), y si no se cumple, sigue con el bucle.