Сейчас везде пишут, что генераторы помогают писать асинхронный код. Я не понимаю, как они могут сделать это.
Возьмем для примера, простенькую функцию, которая асинхронно добавляет единицу в массив, и рассмотрим 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
}())
Как видим, мы только наговняли лишнего кода, без какого бы то ни было выигрыша, к тому же, промисы все равно нужны в обоих случаях.
Я вообще, не против генераторов, они, полезны в других случаях, вопрос в том, а не притягивают ли их за уши к асинхронности? Имеют ли они к этому действительно отношение?