Генератор function*: последовательность значений по запросу
Генератор создаёт последовательность, вычисление которой приостанавливается на yield. Значения можно получать постепенно, не собирая весь результат в массив заранее.
Назначение
Генератор создаёт последовательность, вычисление которой приостанавливается на yield. Значения можно получать постепенно, не собирая весь результат в массив заранее.
Как это работает
Вызов функции со звёздочкой возвращает объект генератора. Next продолжает выполнение до следующего yield или завершения. Возвращаемый объект содержит value и done; for…of автоматически использует этот протокол.
Пример
function* steps() {
yield "Разметка";
yield "Стили";
return "Готово";
}
const iterator = steps();
console.assert(iterator.next().value === "Разметка");
console.assert(iterator.next().done === false);
const last = iterator.next();
console.assert(last.done && last.value === "Готово");
console.assert([...steps()].join("|") === "Разметка|Стили");
console.log(last);
Что должно получиться
Два yield дают элементы последовательности. Финальный return завершает генератор и доступен через next, но не добавляется как обычный элемент при разворачивании через spread.
Граница применения и частая ошибка
Исчерпанный экземпляр генератора не начинает работу заново: нужен новый вызов функции. Генератор не делает тяжёлое вычисление неблокирующим автоматически и не создаёт отдельный поток. Бесконечную последовательность нельзя без ограничения разворачивать в массив.
Самостоятельная проверка
Создайте генератор номеров от одного до пяти. Прервите обход после второго и сравните с новым экземпляром. Отдельно запишите результаты next после завершения, чтобы увидеть значение done.
Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.