Генератор - это императивно управляемый
итератор. Сами итераторы позволяют производить ленивые вычисления.
Практическое применение например в том, что можно построить высокоуровневые абстракции над итераторами:
function* counter() {
let i = 0;
while (true) {
yield i++;
}
}
function* map(innerIterator, f) {
for (const value of innerIterator) {
yield f(value);
}
}
function* filter(innerIterator, f) {
for (const value of innerIterator) {
if (f(value)) {
yield value;
}
}
}
function* take(innerIterator, count) {
let i = 0;
for (const value of innerIterator) {
yield value;
if (++i === count) { return }
}
}
function* inspect(innerIterator) {
for (const value of innerIterator) {
console.log(value);
yield value;
}
}
console.log('Создаем итератор');
const iter = inspect(
take(
map(
filter(
counter(),
v => v % 2 === 0
),
v => v * 2
),
30
)
);
console.log('Итератор есть, но он еще ничего не считает: ', iter);
console.log('Вычисления будут по требованию:');
console.log([...iter]);