JavaScript generatorji

V tej vadnici boste s pomočjo primerov spoznali generatorje JavaScript.

V JavaScript generatorji ponujajo nov način za delo s funkcijami in iteratorji.

Z uporabo generatorja

  • lahko ustavite izvajanje funkcije od kjer koli znotraj funkcije
  • in nadaljujte z izvajanjem kode iz ustavljenega položaja

Ustvari generatorje JavaScript

Če želite ustvariti generator, morate najprej definirati funkcijo generatorja s function*simbolom. Predmeti funkcij generatorja se imenujejo generatorji.

 // define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();

Opomba : Funkcija generatorja je označena z *. Lahko jih uporabite function* generatorFunc() (… )ali function *generatorFunc()(… )ustvarite.

Uporaba donosa za zaustavitev izvrševanja

Kot smo že omenili, lahko zaustavite izvajanje funkcije generatorja, ne da bi zagnali celotno telo funkcije. Za to uporabljamo yieldključno besedo. Na primer

 // 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());

Izhod

 1. koda pred prvim donosom (vrednost: 100, narejeno: napačno)

Tukaj,

  • Ustvarjen je poimenovan objekt generatorja generator.
  • Ko generator.next()je poklican, se izvede koda do prve yield. Ko yieldprogram naleti, vrne vrednost in zaustavi funkcijo generatorja.

Opomba : Pred uporabo spremenljivki morate dodeliti predmete generatorja.

Obdelava izjav z več donosi

yieldIzraz vrne vrednost. Vendar pa za razliko od returnizjave ne prekine programa. Zato lahko nadaljujete z izvajanjem kode z zadnjega mesta. Na primer

 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());

Izhod

 1. koda pred prvim donosom (vrednost: 100, dokončano: napačno) 2. koda pred drugim donosom (vrednost: 200, dokončano: napačno) (vrednost: nedefinirano, dokončano: resnično)

Tukaj je opisano, kako deluje ta program.

  • Prvi generator.next()stavek izvede kodo do prvega stavka yield in zaustavi izvajanje programa.
  • Drugi generator.next()zažene program iz zaustavljenega položaja.
  • Ko se dostopa do vseh elementov, se vrne (vrednost: nedefinirano, dokončano: resnično).
Delovanje funkcije generatorja v JavaScript

Prenos argumentov na funkcije generatorja

Argumente lahko posredujete tudi funkciji generatorja. Na primer

 // 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());

Izhod

 (vrednost: "hello", done: false) 6 nekaj kode (vrednost: 5, done: false) (vrednost: undefined, done: true)

V zgornjem programu

  • Prva generator.next()vrne vrednost yield(v tem primeru 'zdravo'). Vendar vrednost ni dodeljena spremenljivki x vlet x = yield 'hello';
     (vrednost: "hello", storjeno: false)
  • Ko generator.next(6)se sreča, se koda znova začne pri let x = yield 'hello';in argument 6 se dodeli x. Preostala koda se izvrši tudi do sekunde yield.
     6 nekaj kode (vrednost: 5, narejeno: napačno)
  • Ko next()se izvede tretje , se program vrne (vrednost: nedefinirano, končano: resnično). Ker drugih izjav o donosu ni.
     (vrednost: nedefinirano, končano: resnično)

Generatorji se uporabljajo za implementacijo iterables

Generatorji omogočajo enostavnejši način izvajanja iteratorjev.

Če želite iterator implementirati ročno, morate z next()metodo ustvariti iterator in shraniti stanje. Na primer

 // 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); )

Izhod

 1 2 3

Ker so generatorji ponovljivi, lahko iterator implementirate na lažji način. Nato lahko skozi for… ofzanko pregledujete generatorje . Na primer

 // generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )

Generatorske metode

Metoda Opis
next() Vrne vrednost donosa
return() Vrne vrednost in zaključi generator
throw() Vrže napako in zaustavi generator

Vrnitev JavaScript Vs donos Ključna beseda

vrni ključno besedo donosna ključna beseda
Vrne vrednost in zaključi funkcijo. Vrne vrednost in zaustavi funkcijo, vendar funkcije ne zaključi.
Na voljo v običajnih funkcijah in v funkcijah generatorja. Na voljo samo v funkcijah generatorja.

Funkcija generatorja JavaScript z vrnitvijo

returnStavek lahko uporabite v funkciji generatorja. returnIzjava vrne vrednost in prekine funkcije (podobno rednih nalog). Na primer

 // 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());

Izhod

 (vrednost: 100, dokončano: napačno) (vrednost: 123, dokončano: resnično) (vrednost: nedefinirano, dokončano: resnično)

V zgornjem programu, ko pride do returnstavka, vrne vrednost in donelastnost postane true, funkcija pa se konča. Zato next()metoda po returnstavku ne vrne ničesar.

Opomba : return()Metodo lahko uporabite tudi namesto returnstavka, kot je generator.return(123);v zgornji kodi.

Metoda vrženja JavaScript generatorja

Na funkcijo generatorja lahko izrecno vržete napako z uporabo metode throw (). Uporaba throw()metode vrže napako in zaključi funkcijo. Na primer

 // 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());

Izhod

 (vrednost: 1, storjeno: napačno) Napaka: prišlo je do napake.

Uporaba generatorjev

  • Generatorji nam omogočajo, da med pisanjem asinhronih opravil napišemo čistejšo kodo.
  • Generatorji omogočajo enostavnejši način izvajanja iteratorjev.
  • Generatorji izvršijo njeno kodo le, kadar je to potrebno.
  • Generatorji so pomnilniško učinkoviti.

Generatorji so bili predstavljeni v ES6 . Nekateri brskalniki morda ne podpirajo uporabe generatorjev. Če želite izvedeti več, obiščite podporo za generatorje JavaScript.

Zanimive Članki...