Сейчас везде пишут, что генераторы помогают писать асинхронный код. Я не понимаю, как они могут сделать это.
Возьмем для примера, простенькую функцию, которая асинхронно добавляет единицу в массив, и рассмотрим 2 версии, с генераторами и без них. Для простоты, ошибки ловить тоже не будем.
add = function(array){
  return new Promise(function(resolve){
   setTimeout(function(){
      array.push(1)
      resolve(array)
    })
  })
}
//////////////////  Реализация без генераторов /////////////////////
 
add([])
 .then(add)
 .then(add)
 .then(add)
 .then(add)
 .then(function(x) {console.log(x)})
///////////////// Реализация с генераторами ////////////////////////
helper = function(generator, yieldValue){
   var next = generator.next(yieldValue)
   
   if(!next.done) return next.value.then(function(result){
      return helper(generator, result)
   })
   console.log(next.value)
}
helper(function*(){
   var one = yield add([]),
       two = yield add(one),
       three = yield add(two),
       four = yield add(three),
       five = yield add(four)
       
   return five 
   
}())
Как видим, мы только наговняли лишнего кода, без какого бы то ни было выигрыша, к тому же, промисы все равно нужны в обоих случаях.
Я вообще, не против генераторов, они, полезны в других случаях, вопрос в том, а не притягивают ли их за уши к асинхронности? Имеют ли они к этому действительно отношение?
