JavaScript: Generator
New in JS2015.
Generator object is a object that conforms to both the Iterator interface and Iterable interface. [see Interface]
Create Generator
To create a generator:
- Code it by hand, by creating a object with
[Symbol.iterator]
and"next"
properties, conforming to their interfaces. This is difficult to do. - Use Generator Function to create generator object.
Write Generator by Hand
// create a iterator const xitr = {}; xitr.i = 0; xitr.next = () => ((xitr.i < 3) ? { value: xitr.i++, done: false } : { value: undefined, done: true }); // create a generator const xgen = {}; // add a Symbol.iterator property, so it conforms iterable interface xgen[Symbol.iterator] = () => xitr; // add a next property, so it conforms iterator interface xgen.next = xitr.next; // test it as a iterable console.log( [...xgen], ); // [ 0, 1, 2 ] // test it as a iterator // call generator object by using the βnext()β method console.log(xgen.next()); console.log(xgen.next()); console.log(xgen.next()); /* prints [ 0, 1, 2 ] { value: undefined, done: true } { value: undefined, done: true } { value: undefined, done: true } because already reached end when we tested it using spread operator */
Create Generator by Generator Function
// define a generator function function* ff() { yield 3; yield 4; yield 5; } // generator function returns a generator object const xgen = ff(); // now xgen is a generator object // test it as iterable by using spread operator console.log(xgen.next()); console.log(xgen.next()); console.log(xgen.next()); /* { value: 3, done: false } { value: 4, done: false } { value: 5, done: false } */ // test generator as iterable by using spread operator console.log([...xgen]); // [] // empty because already reached the end when we test it using next
[see Generator Function]