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ключовата дума. Например,

 // 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()оператор изпълнява кода до първия оператор за добив и спира на пауза изпълнението на програмата.
  • Вторият 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());

Изход

 (стойност: "здравей", done: false) 6 някакъв код (стойност: 5, done: false) (стойност: undefined, done: true)

В горната програма,

  • Първият generator.next()връща стойността на yield(в този случай „здравей“). Стойността обаче не е присвоена на променлива x inlet x = yield 'hello';
     (стойност: "здравей", направено: невярно)
  • Когато generator.next(6)се срещне, кодът отново започва от let x = yield 'hello';и аргументът 6 се присвоява на x. Също така, останалият код се изпълнява до секундата yield.
     6 някакъв код (стойност: 5, направено: невярно)
  • Когато next()се изпълни третият , програмата се връща (стойност: недефинирано, направено: вярно). Това е така, защото няма други отчети за добива.
     (стойност: недефинирано, направено: вярно)

Генераторите се използват за внедряване на Iterables

Генераторите осигуряват по-лесен начин за внедряване на итератори.

Ако искате да внедрите итератор ръчно, трябва да създадете итератор с 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 дава ключова дума

return Ключова дума 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 генератори.

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