Генератори 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, виконано: помилково)

Ось,

  • Створено іменований об'єкт-генератор 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());

Вихідні дані

 (значення: "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.

Цікаві статті...