Как использовал генераторы в JavaScript/Node.js?

«Как использовал генераторы в JavaScript/Node.js?» — вопрос из категории JavaScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Генераторы в JavaScript — это особые функции (function*), которые могут приостанавливать своё выполнение с помощью ключевого слова yield и возобновлять его позже. В Node.js я применял их для решения специфических задач, где нужен контроль над потоком выполнения.

Базовый пример:

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}

const generator = generateSequence();
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: 3, done: true }

Мои практические кейсы использования в Node.js:

  1. Ленивая генерация данных или ID:

    function* idGenerator() {
      let id = 0;
      while (true) {
        yield ++id;
      }
    }
    const getId = idGenerator();
    console.log(getId.next().value); // 1
    console.log(getId.next().value); // 2
    // Полезно, когда нужно генерировать ID по требованию, не создавая массив заранее.
  2. Работа с большими данными или потоками: Генераторы отлично сочетаются с новыми возможностями Node.js, например, с асинхронными итераторами для чтения больших файлов построчно.

  3. Реализация кастомных итераторов для сложных структур данных.

  4. Кооперативная многозадачность (редко): С помощью библиотек вроде co (популярной до появления async/await) генераторы использовались для написания асинхронного кода в синхронном стиле.

Важно: С появлением async/await необходимость в генераторах для управления асинхронностью отпала. Сейчас их основная ниша — создание лениво вычисляемых последовательностей и работа как итераторов.