Итераторы и генераторы
Вопрос
Расскажите, что такое итераторы и генераторы и где они пригодились бы на практике.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Протокол: `[Symbol.iterator]()` возвращает объект с `next()`, тот отдаёт `{ value, done }`
На протоколе работают `for...of`, spread, деструктуризация, `Array.from`, `Promise.all`
Генератор: `function*`, вызов не выполняет тело, `yield` приостанавливает выполнение
Ленивость: значения вычисляются по запросу, возможны бесконечные последовательности
Двусторонняя связь `next(value)`, делегирование `yield*`
Практика: обход деревьев, пагинация через `async function*` и `for await`, Redux-Saga
Что могут спросить следом
- Как сделать свой класс коллекции итерируемым?
- Что будет с
finallyв генераторе приbreakв цикле? - Как async/await связан с генераторами?
Разбор
Образцовый ответ: «Итерация в JS построена на протоколе. Объект итерируемый, если у него есть метод Symbol.iterator, возвращающий итератор, а итератор это объект с next(), который отдаёт { value, done }. На этом работают for...of, spread, деструктуризация массивов, Array.from, конструкторы Map и Set. Писать итератор руками многословно, и тут помогают генераторы: функция со звёздочкой при вызове возвращает объект-генератор, а тело выполняется кусками до каждого yield. Значения вычисляются лениво, поэтому можно описать бесконечную последовательность и взять из неё сколько нужно. Через next(value) можно передавать данные внутрь, через yield* делегировать вложенному генератору, это удобно для обхода деревьев. Асинхронные генераторы с for await хорошо ложатся на постраничную загрузку: генератор сам ходит за следующей страницей, а потребитель просто перебирает. Исторически на генераторах делали асинхронность до async/await, а Redux-Saga до сих пор на них построена».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Постраничная загрузка через асинхронный генератор
Следующий вопрос
Итерация строки с эмодзи