0Pricing
JavaScript Academy · Урок

Функции-генераторы, 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(), чтобы получать значения
  • Составляйте небольшие цепочки преобразований
Функции-генераторы, yield и небольшие конвейеры — иллюстрация 1

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);
}
Функции-генераторы, yield и небольшие конвейеры — иллюстрация 2

Ручной вызов 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 и небольшие конвейеры — иллюстрация 3

Чётные числа лениво

Генераторы отлично подходят для простых потоков, например последовательности чётных чисел, без предварительного создания больших массивов.

// 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)]);
Функции-генераторы, yield и небольшие конвейеры — иллюстрация 4

Ленивый конвейер 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 и небольшие конвейеры — иллюстрация 5

Хорошие привычки

Советы:

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

Викторина о возвращаемом значении генератора

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

Функции-генераторы, yield и небольшие конвейеры — иллюстрация 7

Итоги

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

Функции-генераторы, yield и небольшие конвейеры — иллюстрация 8

Часто задаваемые вопросы

Урок «Функции-генераторы, 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 — локальная установка не требуется.

Все уроки этого курса

  1. Итерируемый протокол и for...of
  2. Функции-генераторы, yield и небольшие конвейеры
  3. Асинхронные итераторы — for await...of и асинхронные генераторы
← Назад к JavaScript Academy