ЈаваСцрипт генератори

У овом упутству ћете научити о ЈаваСцрипт генераторима уз помоћ примера.

У ЈаваСцрипт-у генератори пружају нови начин рада са функцијама и итераторима.

Користећи генератор,

  • можете зауставити извршавање функције са било ког места унутар функције
  • и наставите са извршавањем кода из заустављеног положаја

Креирајте ЈаваСцрипт генераторе

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

Занимљиви Чланци...