Функции генератора JavaScript

Недооцененная и мощная функция, которая может творить чудеса

В JavaScript функция генератора — это функция, выполнение которой можно приостановить в середине ее выполнения и возобновить позже, что позволяет ей создавать последовательность значений с течением времени, а не создавать все свои значения сразу, как обычная функция. Это может быть полезно для различных задач, таких как создание последовательности чисел, повторение структуры данных или создание бесконечного потока данных.

Чтобы создать функцию-генератор, вы используете синтаксис function* вместо обычного синтаксиса function. Внутри функции генератора вы можете использовать ключевое слово yield, чтобы приостановить функцию и создать значение. Вот пример простой функции-генератора, которая создает последовательность чисел:

function* countFrom(n) {
  while (true) {
    yield n;
    n++;
  }
}

const counter = countFrom(1);

console.log(counter.next().value); // 1
console.log(counter.next().value); // 2
console.log(counter.next().value); // 3

Каждый раз, когда вы вызываете метод next для объекта генератора, возвращаемого функцией генератора, функция возобновляет выполнение с точки, где она была приостановлена, и создает следующее значение в последовательности. Когда функция генератора достигает конца своего выполнения, она возвращает объект со свойством done, установленным на true, что указывает на то, что генератор завершил свою последовательность.

Функции-генераторы часто используются в сочетании с итераторами и циклом for-of для перебора последовательности значений. Вот пример использования функции генератора для создания итератора, который создает последовательность Фибоначчи:

function* fibonacci() {
  let [prev, curr] = [0, 1];
  while (true) {
    [prev, curr] = [curr, prev + curr];
    yield curr;
  }
}

for (const n of fibonacci()) {
  console.log(n);
  if (n >= 1000) {
    break;
  }
}

Еще одно полезное применение функций генератора — создание мастеров форм. Мастер форм — это пользовательский интерфейс, который позволяет пользователю заполнять многоэтапную форму путем последовательного перехода через серию страниц или «шагов». Вы можете использовать функцию-генератор для создания мастера форм, создав функцию-генератор, которая создает шаги формы в виде последовательности значений и использует метод next для перехода между шагами.

Вот пример того, как можно создать мастер форм с помощью функции-генератора:

function* formWizard() {
  // Step 1: Collect personal information
  const personalInfo = yield {
    title: "Personal Information",
    fields: [
      { label: "Full Name", type: "text" },
      { label: "Email Address", type: "email" },
      { label: "Phone Number", type: "tel" },
    ],
  };

  // Step 2: Collect address information
  const addressInfo = yield {
    title: "Address Information",
    fields: [
      { label: "Street Address", type: "text" },
      { label: "City", type: "text" },
      { label: "State", type: "text" },
      { label: "Zip Code", type: "text" },
    ],
  };

  // Step 3: Review and submit form
  const review = yield {
    title: "Review and Submit",
    fields: [
      {
        label: "Review your information",
        type: "review",
        data: { personalInfo, addressInfo },
      },
    ],
  };

  // Return the completed form data
  return { personalInfo, addressInfo, review };
}

const wizard = formWizard();

let step;
while (!(step = wizard.next()).done) {
  // Render the current step of the form wizard
  renderStep(step.value);

  // Wait for the user to submit the current step
  const formData = await getFormData();

  // Pass the form data to the generator function
  wizard.next(formData);
}

// The form wizard is complete
const formData = step.value;
submitForm(formData);

В этом примере функция генератора определяет три шага в мастере форм: личная информация, информация об адресе, просмотр и отправка. Каждый раз, когда метод next вызывается для объекта генератора, функция генератора создает следующий шаг в виде объекта с title и списком fields. Данные формы для каждого шага передаются функции-генератору в качестве аргумента метода next, а окончательные данные формы возвращаются функцией-генератором по завершении.

Свяжитесь со мной здесь: LinkedIn | Кодепен | "Электронная почта"