Generators JavaScript
JS
S
JavaScriptProblem: Easy to make mistakes with custom iterators (state keeping is explicitly coded) Generators are functions which can be exited and later re-entered. They also keep the state neatly. Generators will compute their yielded values on demand https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function%2A
1// Useful Use Case (Tokens Consumer)
2// ========================================================================================
3const tokens = ['xxx','yyy','zzz'];
4function* static3TokenGenerator(key) {
5 while (key < tokens.length + 1) {
6 yield tokens[key];
7 key = key + 1;
8 }
9}
10const tokenGenerator = static3TokenGenerator(0);
11// consume tokens
12console.log(tokenGenerator.next().value);
13console.log(tokenGenerator.next().value);
14console.log(tokenGenerator.next().value);
15
16
17// Simple Incrementers
18// ========================================================================================
19function* indefiniteIdMaker(){
20 let index = 0;
21 while (index < index+1)
22 yield index++;
23}
24
25function* incrementsOf10(i){
26 yield i;
27 yield i + 10;
28}
29
30
31const generatorId = indefiniteIdMaker();
32const generatorInc10 = incrementsOf10(10);
33
34console.log(generatorId.next().value); // 0
35console.log(generatorId.next().value); // 1
36
37console.log(generatorInc10.next().value); // 10
38console.log(generatorInc10.next().value); // 20
39
40
41// Yield* middleware generators
42// ========================================================================================
43function* anotherGenerator(i) {
44 yield i + 1; // 11
45}
46
47function* generator(i) {
48 yield i; // 10
49 yield* anotherGenerator(i); // 11 - it's using state = 10
50 yield* anotherGenerator(i); // 11 - it's using state = 10
51 yield i + 10; // 20
52}
53
54const gen = generator(10);
55
56console.log(gen.next().value); // 10
57console.log(gen.next().value); // 11
58console.log(gen.next().value); // 11
59console.log(gen.next().value); // 20
60console.log(gen.next().value); // undefined
61
62
63// Generator Arguments
64// ========================================================================================
65function* logGenerator() {
66 console.log(0);
67 console.log(1, yield);
68 console.log(2, yield);
69 console.log(3, yield);
70 return 55; // quits generator
71 console.log(4, yield); // unreachable
72}
73const generatorArguments = logGenerator();
74
75generatorArguments.next(); // cold start until first yield
76generatorArguments.next('test');
77generatorArguments.next('aaa');
78generatorArguments.next('bbb');
79console.log(generatorArguments.next('ccc').done); // true
80generatorArguments.next('ccc'); // empty - unreachableCreated on 2/28/2018