JavaScript często wymyśla rozwiązania różnych problemów, szczególnie wraz z pojawieniem się wersji JavaScript ES6. Jedną z kluczowych funkcji, które zostały wprowadzone w ES6, były generatory, generatory w JavaScript są używane z iteratorami do tworzenia przepływu danych lub strumienia danych. Generatory pomagają nam uniknąć problemów z funkcją wywołania zwrotnego.
Co tak naprawdę są generatory
Krótko mówiąc, generatory są specjalnymi funkcjami; W przeciwieństwie do normalnych funkcji, które mają tylko jedną instrukcję powrotną, generatory zwracają wiele wartości, ale w różnych momentach.
Aby być bardziej opisowym, generatory są funkcjami, które zwracają wartość w połowie drogi za pośrednictwem funkcji, a następnie przestają wykonywać po zapisaniu stanu, ten etap zwracania wartości, stan zapisywania i zatrzymanie wykonywania jest wywoływane wydajność wartość i zatrzymanie.
Podczas tej przerwy program może pracować nad inną funkcjonalnością, a następnie, gdy jesteśmy wymagani, generator jest proszony o zwrócenie następnej wartości, ale zamiast ponownego uruchomienia całej funkcji, generator działa od punktu, w którym zatrzymał Następna wartość. W ten sposób tworzenie stałego strumienia danych. Dlatego funkcje te są nazywane „generatorami”, ponieważ są używane do generowania strumienia danych.
Możemy spojrzeć na następujące schematy robocze, aby lepiej zrozumieć różnicę między funkcjami normalnymi i generatorami:
I funkcja generatora działa w ten sposób:
Jak zdefiniować funkcję generatora?
Ponieważ funkcje generatora są funkcjami specjalnymi, dlatego używamy specjalnego słowa kluczowego, jednocześnie definiując je "funkcjonować*" - gwiazdka po słowie kluczowym funkcji. Składnia jest jak:
funkcja* nazwa funkcji (params)'
Notatka:
Wartość zwracana: Obiekt [generator] - obiekt generatora LUB niezdefiniowany, jeśli generator jest pusty
Znamy teraz, czym jest funkcja generatora, ale nadal nie znamy jej typu powrotu, który jest „obiektem generatora”.
Co to jest obiekt generatora?
Po utworzeniu funkcji generatora zwraca obiekt, który musimy zainicjować w jakiejś zmiennej, ta zmienna jest wówczas znana jako obiekt generatora. Ten obiekt generatora służy do uzyskania następnej wartości z funkcji.
Składnia inicjowania obiektu generatora
zmienna = generatorFunctionName (argumenty);Po utworzeniu obiektu generatora możesz użyć funkcji „obiekt.Następny()"
obiekt.Następny() Zwraca obiekt JSON o dwóch właściwościach, jeden to „wartość”, a druga to „zrobione" nieruchomość.
Uzyskanie wartości z funkcji generatora
Utwórzmy prostą funkcję generatora, która zwróci nam nową wartość za każdym razem, gdy jest wywoływana, z następującymi wierszami kodu:
generator funkcyjny()Teraz, gdy mamy generator, musimy go zainicjować za pomocą obiektu generatora, robimy to z następującym stwierdzeniem:
const genObject = generator ();Teraz mamy również obiekt generatora. Wszystko, co musimy teraz zrobić, to zadzwonić Następny() funkcja obiektu generatora i wydrukuj obiekt JSON z konsola.dziennik() funkcjonować.
konsola.Log (GenObject.Następny());Kompletny fragment kodu wygląda tak:
generator funkcyjny()Otrzymujemy następujące dane wyjściowe:
Jak widać, wydrukowaliśmy 3 różne obiekty JSON z 3 różnymi wywołaniami do tej samej funkcji generatora. Ale czasami chcemy użyć wartości, a nie obiektu JSON. Możemy to zrobić, uzyskując dostęp do wartość właściwość obiektu JSON z następującym wierszem kodu:
konsola.Log (GenObject.Następny().wartość);Dzięki tym wierszom otrzymujemy następujące dane wyjściowe:
Jak widać, obiekt.Następny().wartość Zwraca nam wartość, którą możemy nawet przekazać na inną funkcję.
Praca funkcji generatora w jednoczesnym wykonywaniu kodu
W tym samouczku stwórzmy prostą funkcję generatora, która daje liczby od 1 do 5 i po każdej liczbie, którą pobieramy z generatora, nasz program ostrzega nas, że wykonuje pewne obliczenia na tej liczbie i opuścił funkcję generatora.
Pierwszym krokiem jest utworzenie funkcji generatora, która da 5 różnych liczb na 5 różnych połączeniach z następującymi wierszami kodu:
generator funkcyjny()Jak widać, utworzyliśmy pętlę, która zwróci 1 nową liczbę całkowitą na każdym wywołaniu wydajności generatora i monituje o tym, gdy program znajduje się w funkcji generatora.
Teraz musimy zainicjować tę funkcję generatora za pomocą obiektu generatora z następującym wierszem kodu.
const genObject = generator ();Teraz potrzebujemy funkcji, która wykona pewną pracę nad wynikami, utwórz funkcję za pomocą następujących wierszy:
Funkcja stoliprinter (num)Mamy funkcję generatora, obiekt generatora i funkcję, która będzie działać na niektórych wartościach, które są w niej przekazane. Teraz potrzebujemy tylko iteratora, który będzie iterowany przez obiekt generatora i przekazał wartości do funkcji. Robimy to za pomocą następujących wierszy kodu:
grendValue = genObject.Następny().wartość;Ten kod zrobi to, że weźmie następną wartość z generatora i przechowuje ją w zmiennej. Następnie w pętli While sprawdzi, czy zmienna jest niezdefiniowana, czy nie, i czy nie jest niezdefiniowana, przekazuje tę wartość do funkcji „stół ” i przejdź do następnej wartości.
Kompletny fragment kodu jest jako:
generator funkcyjny()Dane wyjściowe następującego kodu to:
Jak widać, program wchodzi do funkcji generatora i daje nową wartość, zapisuje stany, zatrzymuje wykonanie funkcji, wchodzi do „stół ” funkcjonować i wykonuje tam wykonanie. Po zakończeniu wraca do funkcji generatora dla nowej wydajności. Cały ten proces jest powtarzany, dopóki generator będzie wytwarzał nowe plony. Tak więc, czyniąc go strumieniem danych.
To wszystko dla generatorów w JavaScript.
Wniosek
Generatory to specjalne funkcje, które mogą zatrzymać ich wykonanie w połowie drogi, aby uzyskać wartość, zapisać ich stan i pozwolić programowi wykonywać inne zadania. W razie potrzeby funkcja generatora „wznowić ” ich egzekucja od państwa, w którym się zatrzymali. Generatory są używane do generowania stałego strumienia danych. Są one używane we współpracy z obietnicami i iteratorami w celu stworzenia nieskończonego strumienia danych i uniknięcia problemów z funkcją wywołania zwrotnego.