Ответ вслух Middle Итераторы и генераторы обновлено

Итераторы и генераторы

Вопрос

Расскажите, что такое итераторы и генераторы и где они пригодились бы на практике.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Итерация в JS построена на протоколе. Объект итерируемый, если у него есть метод Symbol.iterator, возвращающий итератор, а итератор это объект с next(), который отдаёт { value, done }.

Что должно прозвучать в ответе

  • Протокол: `[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 ошибок.