В практике генераторы не используются. Конец. :)
На самом деле я лично видел ровно два практических кейса использования генераторов:
1. Использование для асинхронных операций с возможностью прерывания, примеры: redux-saga, mobx actions.
Суть: допустим ты делаешь какую-то ступенчатую операцию, и нужна возможность резко остановить исполнение извне. На async-ax тебе придётся городить что-то типа:
async function multiStep() {
await step1();
if (stop) throw new Error(stop);
await step2();
if (stop) throw new Error(stop);
await step3();
if (stop) throw new Error(stop);
}
и никак красивее не сделать.
На генераторе ты можешь просто писать:
function* multiStep() {
yield step1();
yield step2();
yield step3();
}
и просто не брать следующее значение, если исполнение прервалось.
2. До появления воркеров с их помощью можно было работать с очень большими массивами не вызывая зависания страницы.
На этом всё.:)