Генераторы JavaScript

В этом руководстве вы узнаете о генераторах JavaScript с помощью примеров.

В JavaScript генераторы предоставляют новый способ работы с функциями и итераторами.

Используя генератор,

  • вы можете остановить выполнение функции из любого места внутри функции
  • и продолжить выполнение кода с остановленной позиции

Создать генераторы JavaScript

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

 // define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();

Примечание : функция генератора обозначена *. Вы можете использовать function* generatorFunc() (… )или function *generatorFunc()(… )создавать их.

Использование yield для приостановки выполнения

Как упоминалось выше, вы можете приостановить выполнение функции генератора, не выполняя все тело функции. Для этого мы используем yieldключевое слово. Например,

 // generator function function* generatorFunc() ( console.log("1. code before the first yield"); yield 100; console.log("2. code before the second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next());

Вывод

 1. код перед первым выходом (значение: 100, выполнено: false)

Вот,

  • Создается объект-генератор с именем generator.
  • Когда generator.next()вызывается, выполняется код до первого yield. Когда yieldвстречается, программа возвращает значение и приостанавливает функцию генератора.

Примечание. Перед использованием переменной необходимо назначить объекты-генераторы.

Работа с несколькими отчетами о доходности

yieldВыражение возвращает значение. Однако, в отличие от returnоператора, он не завершает программу. Вот почему вы можете продолжить выполнение кода с последней уступленной позиции. Например,

 function* generatorFunc() ( console.log("1. code before first yield"); yield 100; console.log("2. code before the second yield"); yield 200; console.log("3. code after the second yield"); ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());

Вывод

 1. код перед первым выходом (значение: 100, готово: ложь) 2. код перед вторым выходом (значение: 200, готово: ложь) (значение: не определено, готово: истина)

Вот как работает эта программа.

  • Первый generator.next()оператор выполняет код до первого оператора yield и приостанавливает выполнение программы.
  • Второй generator.next()запускает программу из приостановленной позиции.
  • Когда все элементы доступны, он возвращает (значение: undefined, done: true).
Работа функции генератора в JavaScript

Передача аргументов функциям генератора

Вы также можете передавать аргументы функции генератора. Например,

 // generator function function* generatorFunc() ( // returns 'hello' at first next() let x = yield 'hello'; // returns passed argument on the second next() console.log(x); console.log('some code'); // returns 5 on second next() yield 5; ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next(6)); console.log(generator.next());

Вывод

 (значение: "привет", готово: ложь) 6 некоторый код (значение: 5, готово: ложь) (значение: не определено, готово: истина)

В приведенной выше программе

  • Первый generator.next()возвращает значение yield(в данном случае «привет»). Однако значение не присваивается переменной x вlet x = yield 'hello';
     (значение: "привет", выполнено: ложь)
  • Когда generator.next(6)встречается, код снова начинается с, let x = yield 'hello';и аргументу 6 присваивается значение x. Также оставшийся код выполняется с точностью до секунды yield.
     6 некоторый код (значение: 5, выполнено: ложь)
  • Когда выполняется третий next(), программа возвращает (значение: undefined, done: true). Это потому, что нет других операторов доходности.
     (значение: не определено, выполнено: верно)

Генераторы используются для реализации итераций

Генераторы обеспечивают более простой способ реализации итераторов.

Если вы хотите реализовать итератор вручную, вам нужно создать итератор с next()методом и сохранить состояние. Например,

 // creating iterable object const iterableObj = ( // iterator method (Symbol.iterator)() ( let step = 0; return ( next() ( step++; if (step === 1) ( return ( value: '1', done: false); ) else if (step === 2) ( return ( value: '2', done: false); ) else if (step === 3) ( return ( value: '3', done: false); ) return ( value: '', done: true ); ) ) ) ) for (const i of iterableObj) ( console.log(i); )

Вывод

 1 2 3

Поскольку генераторы являются повторяемыми, вы можете проще реализовать итератор. Затем вы можете перебирать генераторы с помощью for… ofцикла. Например,

 // generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )

Генераторные методы

Метод Описание
next() Возвращает значение доходности
return() Возвращает значение и завершает работу генератора
throw() Выдает ошибку и завершает работу генератора

JavaScript return против ключевого слова yield

вернуть ключевое слово ключевое слово yield
Возвращает значение и завершает функцию. Возвращает значение и останавливает функцию, но не завершает ее.
Доступен как в обычных функциях, так и в функциях генератора. Доступно только в функциях генератора.

Функция генератора JavaScript с возвратом

You can use the return statement in a generator function. The return statement returns a value and terminates the function (similar to regular functions). For example,

 // generator function function* generatorFunc() ( yield 100; return 123; console.log("2. some code before second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());

Output

 (value: 100, done: false) (value: 123, done: true) (value: undefined, done: true)

In the above program, when the return statement is encountered, it returns the value and done property becomes true, and the function terminates. Hence, the next() method after the return statement does not return anything.

Note: You can also use the return() method instead of the return statement like generator.return(123); in the above code.

JavaScript Generator Throw Method

Вы можете явно выдать ошибку функции генератора с помощью метода throw (). Использование throw()метода вызывает ошибку и завершает функцию. Например,

 // generator function function* generatorFunc() ( yield 100; yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); // throws an error // terminates the generator console.log(generator.throw(new Error('Error occurred.'))); console.log(generator.next());

Вывод

 (значение: 1, выполнено: false) Ошибка: Произошла ошибка.

Использование генераторов

  • Генераторы позволяют писать более чистый код при написании асинхронных задач.
  • Генераторы обеспечивают более простой способ реализации итераторов.
  • Генераторы выполняют его код только при необходимости.
  • Генераторы эффективно используют память.

Генераторы были представлены в ES6 . Некоторые браузеры могут не поддерживать использование генераторов. Чтобы узнать больше, посетите страницу поддержки генераторов JavaScript.

Интересные статьи...