У овом упутству ћете научити о ЈаваСцрипт генераторима уз помоћ примера.
У ЈаваСцрипт-у генератори пружају нови начин рада са функцијама и итераторима.
Користећи генератор,
- можете зауставити извршавање функције са било ког места унутар функције
- и наставите са извршавањем кода из заустављеног положаја
Креирајте ЈаваСцрипт генераторе
Да бисте креирали генератор, прво морате да дефинишете функцију генератора са 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()
покреће програм из паузираног положаја. - Када се приступи свим елементима, он се враћа (вредност: недефинисано, готово: тачно).

Преношење аргумената на функције генератора
Такође можете проследити аргументе функцији генератора. На пример,
// 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
(у овом случају, 'здраво'). Међутим, вредност није додељена променљивој к инlet x = yield 'hello';
(вредност: „здраво“, готово: нетачно)
- Када
generator.next(6)
се наиђе, код поново започиње саlet x = yield 'hello';
и аргумент 6 се додељује к. Такође, преостали код се извршава до секундеyield
.6 неки код (вредност: 5, готово: нетачно)
- Када
next()
се изврши трећа , програм се враћа (вредност: недефинисано, готово: тачно). То је зато што не постоје друге изјаве о приносу.(вредност: недефинисано, готово: тачно)
Генератори се користе за примену интерактивних компонената
Генератори пружају лакши начин примене итератора.
Ако желите ручно да примените итератор, морате да креирате итератор помоћу 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() | Баца грешку и искључује генератор |
ЈаваСцрипт враћа Вс даје кључну реч
ретурн Кључна реч | ииелд Кључна реч |
---|---|
Враћа вредност и завршава функцију. | Враћа вредност и зауставља функцију, али не прекида функцију. |
Доступно у нормалним функцијама и функцијама генератора. | Доступно само у функцијама генератора. |
ЈаваСцрипт генератор функција са повратком
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()
методе доводи до грешке и прекида функцију. На пример,
// 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, готово: нетачно) Грешка: Дошло је до грешке.
Употреба генератора
- Генератори нам дозвољавају да напишемо чистији код док пишемо асинхроне задатке.
- Генератори пружају лакши начин примене итератора.
- Генератори извршавају његов код само када је то потребно.
- Генератори су ефикасни у меморији.
Генератори су представљени у ЕС6 . Неки прегледачи можда не подржавају употребу генератора. Да бисте сазнали више, посетите подршку за ЈаваСцрипт генераторе.