В този урок ще научите за 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).

Предаване на аргументи на функции на генератора
Можете също да предавате аргументи на функция генератор. Например,
// 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 генератори.