Iterable protokol

Karakteristike protokola

“Iterable protokol” je dogovoren APi na nivou JavaScript-a kao jezika, za kreiranje objekata koji se mogu koristiti za iteraciju nad kolekcijom podataka. Ključna karakteristika ovoga protokola je “sekvencijalanost” tj. osobina da pri iteraciji vraća vrednost iterabilne strukture jednu po jednu. Tipovi podataka koji zadovoljavaju iterable protokol se nazivaju “iterable kolekcije”. Poštujući iterable protokol potrebno je da funkcija vraća objekat koji sadrži specijalnu metodu “next()”.

next()

Metoda next() pri pozivanju vraća člana kolekcije privremeno “obmotanog” (eng. wrapped”) sa objektom koji ima dva svojstva: value i done. Dokle god postoje članovi za iteraciju, metoda vraća vrednost svojstsva “done” kao”false”, a tek kada iteracija “dodje” do kraja, svojstvo “done” se definiše kao “true”.

Primer

Kroz naredni primer je opisana koncepcija protokola:

Koji su tipovi podataka iterabilni?

Treba nagalasiti da obični javascript objekti nisu iterabilini, ali zato sledeći tipovi podataka zadovoljavaju iterable protokol:

  • String
  • Array
  • Array-like argumenti ili NodeList objekat
  • TypedArray
  • Map
  • Set

Koji mehanizmi u JavaScriptu zahtevaju iterable kolekciju?

Mehanizmi za čije korišćenje su neophodne “iterable” kolekcije su:

  • Destructuring
  • for..of loop
  • Array.from()
  • Spread operator ()
  • Maps & Sets
  • Promise.all(), Promise.race()
  • yield*
Primer

Iterable kolekcije mogu koristi mehanizme za koje su potrebni iterable kolekcije kao npr. iteracija sa “for..of” petljom:

ili pri destruktuiranju:

Iterable i Iterator

Kreiranje iteratora sa iterable objektom

Za kreiranje iteratora je potrebno da objekat ima specifični interni metod koji vraća iterator, a čiji ključ je “Symbol.iterator”. Takav objekat se naziva “Iterable objekat”.

Iterator objekat nastaje pozivajući metodu iterable objekta pod nazivom: “[Symbol.iterator]( )”.

iterator

Definicija

Iterator je objekat, koji zna kako da pristupi članovima iterable kolekcije, jedan po jedan i sadrži pointer koji ukazuje na sledeći element. Iterator objekat obezbedjuje “next()” metodu, koja vraća člana kolekcije “obmotanog” (eng. wrapped”) sa objektom koji ima dva svojstva: value i done.

Primer

Kao što se iz prethodnog primera vidi da svojstvo “done” signalizira kada je iteracije došla do kraja.

Primena Iterable i Iteratora

Zahvaljujući iteratoru i metodi next() je omogućena iteracija kroz iterabilnu kolekciju za for..of petljom:

Generatorska funkcija i Generatori

Obeležavanje generatorske funkcije

Generatorska funkcija je specijalni tip funkcije koja se obeležava na sledeći način:

Generatorska funkcija može da se definiše i kao metoda objekta:

ili čak kao metoda klase:

Karakteristike generatorske funkcije

Generatorska funkcija se ponaša kao “factory” za specifične iteratore tzv. generatori, a pored toga može pauzirati svoj rad sa ključnom reči “yield”. Kada kompajler pri izvršavanju funkcije “naleti” na ključnu reč “yield” pauzira dalje izvršenje funkcije i vraća generator objekat koji je napravljen u skladu sa “iterable protokolom” (iterable). Ključnu reč “yield” je dozvoljeneo koristiti samo u okviru generatora. Za nastavljanje izvršavanja generatorske funkcije se primenjuje iteratorova metoda “next()”.

generator

Generatori

generators

Generator je specifični tip iteratora, koji nastaje pozivanjem generatorske funkcije. Generatorska funkcija generiše iterable skup podataka, stoga možemo da koristimo next() metodu kao i “for..of” petlju za iteraciju. Razlike izmedju “običnog” iteratora i generatora su:

  • kod generatora metoda može da primi parametar gen.next(value)
  • postoji dodatna metoda throw()

Kao i kod iteratora, “next()” metoda vraća člana kolekcije “obmotanog” sa objektom koji ima dva svojstva: vrednost i done. Vrednost svojstva može biti dobijena direktno sa yield ili kao vraćena vrednost parametra generatora. Ključna reč “yield” uvek vraća neku vrednost čak iako je null.

“Generatori imaju ugradjen komunikacijski kanal sa yield”

Primer

U ovome primeru je nakon izvršenja prvog reda, ključna reč “yield” pauzira dalje izvršenje funkcije. Za nastavak funkcije je koršćena metoda “next()”, nakon čega metoda vraća sledećeg člana kolekcije “obmotanog” (eng. wrapped”) sa objektom koji ima dva svojstva: value i done.

Zahvaljujući osobini generatorske funkcije koja može da se pri izvršavanju pauzira a zatim nastavi izvršavanje, samo sa generataorima i generatorski funkcijama je moguće da zaustavimo izvršenje jedne funkcije, startujemo drugu koja nam vraća vrednost, a tu vrednost pošaljemo nazad kroz parametar u prvu funkciju i nastavimo izvršavanje.

Primer

Primer

Zahvaljujući mogućnosti da funkcija može da zaustavi svoje izvršenje možemo nakon toga pozvati drugu funkciju kao u ovome primeru:

Podelite:

Ostavite komentar