Jednym z zastosowań generatorów są wszelkiej maści wizualizacje, pokazujące jak dana funkcja działa (np. jakiś algorytm sortowania). Zobaczmy na przykładzie map!

Napisany wcześniej polyfill:

Array.prototype.myMap = function(callbackFn, thisArg) {

    var context = thisArg || globalThis;

    var arr = [];              
    for (var i = 0; i < this.length; i++) { 
      arr.push(callbackFn.call(context, this[i], i, this));
    }
    return arr;
  }

Przerabiamy na generator:

Array.prototype.myMap = function*(callbackFn, thisArg) {

    var context = thisArg || globalThis;

    var arr = [];              
    for (var i = 0; i < this.length; i++) { 
      arr.push(callbackFn.call(context, this[i], i, this));
      yield arr.toString();
    }
    //yield arr;
  }

Trochę kombinowania jest z wizualizacją, ale koniec końców to jest patent:

while(true){
    gen = visualize.next();
    if(gen.done === true)
        break;
    console.log(gen.value);
}

//2
//2,4
//2,4,6
//2,4,6,8

Ok, możemy podejść do tego w ten sposób:

Array.prototype.myMap = function*(callbackFn, thisArg) {

    var context = thisArg || globalThis;

    var arr = [];              
    for (var i = 0; i < this.length; i++) { 
      arr.push(callbackFn.call(context, this[i], i, this));
      yield arr.toString();
    }
    return arr;
  }

let arr = [1,2,3,4];
let visualize = arr.myMap((el) => el * 2);

function visualizeFromGenerator(visualize){
    let gen;
    while(true){
        gen = visualize.next();
        if(gen.done === true)
            break;
        console.log(gen.value);
    }
    return gen.value;

}

//2
//2,4
//2,4,6
//2,4,6,8

let finalArr = visualizeFromGenerator(visualize);
console.log(finalArr);
//Array[2,4,6,8]

Jeszcze jedno małe usprawnienie:

Array.prototype.myMap = function*(callbackFn, thisArg) {

    var context = thisArg || globalThis;

    var arr = [];              
    for (var i = 0; i < this.length; i++) { 
      arr.push(callbackFn.call(context, this[i], i, this));
      let arrToShow = [...arr.slice(0, i+1), ...this.slice(i+1)];
      yield arrToShow.toString();
    }
    return arr;
  }

let arr = [1,2,3,4];
let visualize = arr.myMap((el) => el * 2);

function visualizeFromGenerator(visualize){
    let gen;
    while(true){
        gen = visualize.next();
        if(gen.done === true)
            break;
        console.log(gen.value);
    }
    return gen.value;

}

//2,2,3,4 
//2,4,3,4 
//2,4,6,4 
//2,4,6,8

let finalArr = visualizeFromGenerator(visualize);
console.log(finalArr);
//Array[2,4,6,8]

Mając już tę wiedzę możemy robić naprawdę konkretne wizualizacje różnych algorytmów.