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.