В этом руководстве вы узнаете о генераторах 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).

Передача аргументов функциям генератора
Вы также можете передавать аргументы функции генератора. Например,
// 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.