¿Cómo crear un objeto Generator en JavaScript?
Un objeto generator es retornado después de llamar a una función Generator. Es importante no confundir una función y un objeto Generator.
Función Generator.
function* funcGenerator() {
console.log("inicializado");
yield "a";
console.log("enviado el primer yield");
yield;
console.log("enviado el segundo yield");
yield 123;
console.log("enviado el tercer yield");
return "finished";
}
Objeto Generator.
var objGenerator = funcGenerator();
console.log(objGenerator.next()); // { value: 'a', done: false }
console.log(objGenerator.next()); // { value: undefined, done: false }
console.log(objGenerator.next()); // { value: 123, done: false }
console.log(objGenerator.next()); // { value: 'finished', done: false }
console.log(objGenerator.next()); // { value: undefined, done: true }
¿Como iterar a través del objeto Generator mediante la función next?
Los Objetos Generator pueden ser iterados mediante el método next()
.
Las funciones del Generator son inicialmente pausadas, y la primera llamada a next()
inicia la función Generator. La función Generator entonces se ejecuta hasta que encuentra el primer yield
y después se pausa. La posterior llamada anext()
resumirá el proceso de ejecución de la función Generator hasta que esta encuentre nuevamente la palabra yield
.
El método next()
retorna un objeto con dos propiedades.
- done : un valor boleano que indica si la función Generator ha procesado todas las sentencias
yield
o ha alcanzado ya el return. - value : el valor asociado con el yield mas reciente.
Vea como el método next()
es utilizado para iterar a través de las sentencias yield
.
var objGenerator1 = funcGenerator();
console.log(objGenerator1); // Object { value: 'a', done: false }
var objGenerator2 = funcGenerator();
console.log(objGenerator2); // Object { value: undefined, done: false }
var objGenerator3 = funcGenerator();
console.log(objGenerator3); // Object { value: 123, done: false }
Después de que se han procesado todas las sentencias
next()
, la siguiente llamada anext()
retornará un objeto con el valor retornado por la función y la propiedad done con valor true. Si la sentencia return es omitida en la función Generator, entonces el valor de la propiedad done seraundefined
. Después de que la propiedaddone
es retornada comotrue
, las llamadas posteriores anext()
retornaran un Objeto Generator con la propiedadvalue
comoundefined
ydone
como true. Las sentencias yield posteriores a un return son ignoradas.