У цьому посібнику ви дізнаєтеся про генератори 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, виконано: помилково)
Ось,
- Створено іменований об'єкт-генератор
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());
Вихідні дані
(значення: "hello", done: false) 6 деякий код (значення: 5, done: false) (значення: undefined, done: true)
У наведеній вище програмі
- Перший
generator.next()
повертає значенняyield
(в даному випадку "привіт"). Однак значення не присвоюється змінній x вlet x = yield 'hello';
(значення: "привіт", зроблено: false)
- При
generator.next(6)
виявленні код знову починається зlet x = yield 'hello';
і аргумент 6 присвоюється x. Також залишковий код виконується до секундиyield
.6 деякий код (значення: 5, виконано: помилково)
- Коли третій
next()
виконується, програма повертається (значення: невизначено, зроблено: істина). Це тому, що немає інших заяв про прибутковість.(значення: undefined, зроблено: 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 Vs дає ключове слово
повернути ключове слово | 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, зроблено: хибно) Помилка: сталася помилка.
Використання генераторів
- Генератори дозволяють писати чистіший код під час написання асинхронних завдань.
- Генератори забезпечують простіший спосіб реалізації ітераторів.
- Генератори виконують його код лише тоді, коли це потрібно.
- Генератори мають ефективну пам’ять.
Генератори були введені в ES6 . Деякі браузери можуть не підтримувати використання генераторів. Щоб дізнатись більше, відвідайте підтримку генераторів JavaScript.