Функции-генераторы, yield и небольшие конвейеры
Пишите функции-генераторы с function*, используйте yield для ленивой выдачи значений, управляйте ими через for...of или next() и составляйте небольшие конвейеры
«Функции-генераторы, yield и небольшие конвейеры» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 3 уроков всего.
Зачем нужны генераторы
Цель: лениво выдавать значения с помощью генераторов.
- function* определяет генератор
- yield выдаёт значения шаг за шагом
- Используйте for...of или next(), чтобы получать значения
- Составляйте небольшие цепочки преобразований

function* и yield
Генераторы используют function* и yield. Итерация продолжается с места последнего yield.
// A basic generator that yields 1..n lazily
function* countTo(n) {
for (let i = 1; i <= n; i = i + 1) {
yield i; // pause here and give i to the caller
}
}
for (const x of countTo(3)) {
console.log("value:", x);
}

Ручной вызов next()
next() последовательно проходит по значениям, выдаваемым с помощью yield, и после завершения возвращает done: true.
// You can also drive a generator manually with next()
const it = countTo(2);
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: undefined, done: true }

Чётные числа лениво
Генераторы отлично подходят для простых потоков, например последовательности чётных чисел, без предварительного создания больших массивов.
// Yield even numbers up to n (inclusive)
function* evensUpTo(n) {
for (let i = 0; i <= n; i = i + 1) {
if (i % 2 === 0) {
yield i;
}
}
}
console.log("evens 0..6:", [...evensUpTo(6)]);

Ленивый конвейер map
Составляйте небольшие шаги: передавайте один генератор в другой, чтобы строить ленивые конвейеры.
// map() as a generator: transform values lazily
function* map(iterable, fn) {
for (const v of iterable) {
yield fn(v);
}
}
const doubled = map(countTo(4), function (x) { return x * 2; });
console.log("doubled:", [...doubled]);

Хорошие привычки
Советы:
- Вызовите функцию-генератор, чтобы получить итератор (она не выполняется полностью сразу).
- yield приостанавливает выполнение, а return завершает последовательность.
- После завершения генератор исчерпан; для нового итератора снова вызовите функцию.

Викторина о возвращаемом значении генератора
Быстрая проверка: что возвращает функция-генератор?

Итоги
Итоги: определяйте function*, лениво выдавайте значения с помощью yield, потребляйте их через for...of или next() и объединяйте небольшие конвейеры генераторов для простых преобразований.

Часто задаваемые вопросы
Урок «Функции-генераторы, yield и небольшие конвейеры» бесплатный?
Да — полный текст урока «Функции-генераторы, yield и небольшие конвейеры» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 3 уроков всего.
Чему я научусь в уроке «Функции-генераторы, yield и небольшие конвейеры»?
Пишите функции-генераторы с function*, используйте yield для ленивой выдачи значений, управляйте ими через for...of или next() и составляйте небольшие конвейеры Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать JavaScript Academy?
Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «Функции-генераторы, yield и небольшие конвейеры»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке JavaScript Academy?
Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Итерируемый протокол и for...of
- Функции-генераторы, yield и небольшие конвейеры
- Асинхронные итераторы — for await...of и асинхронные генераторы