W tym samouczku dowiesz się o generatorach JavaScript przy pomocy przykładów.
W JavaScript generatory zapewniają nowy sposób pracy z funkcjami i iteratorami.
Korzystanie z generatora,
- możesz zatrzymać wykonywanie funkcji z dowolnego miejsca wewnątrz funkcji
- i kontynuuj wykonywanie kodu z pozycji zatrzymania
Twórz generatory JavaScript
Aby utworzyć generator, musisz najpierw zdefiniować funkcję generatora za pomocą function*
symbolu. Obiekty funkcji generatorów nazywane są generatorami.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Uwaga : Funkcja generatora jest oznaczona przez *
. Możesz ich użyć function* generatorFunc() (… )
lub, function *generatorFunc()(… )
aby je utworzyć.
Korzystanie z yield do wstrzymania wykonywania
Jak wspomniano powyżej, można wstrzymać wykonywanie funkcji generatora bez wykonywania całej treści funkcji. W tym celu używamy yield
słowa kluczowego. Na przykład,
// 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());
Wynik
1. kod przed pierwszym zyskiem (wartość: 100, gotowe: fałsz)
Tutaj,
- Zostanie
generator
utworzony obiekt generatora o nazwie . - Kiedy
generator.next()
jest wywoływana, wykonywany jest kod aż do pierwszegoyield
. Poyield
napotkaniu program zwraca wartość i wstrzymuje działanie generatora.
Uwaga : Musisz przypisać obiekty generatora do zmiennej przed jej użyciem.
Praca z wieloma zestawieniami zysków
yield
Wyrażenie zwraca wartość. Jednak w przeciwieństwie do return
instrukcji nie powoduje zakończenia programu. Dlatego możesz kontynuować wykonywanie kodu od ostatniej uzyskanej pozycji. Na przykład,
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());
Wynik
1. kod przed pierwszym zyskiem (wartość: 100, gotowe: fałsz) 2. kod przed drugim zyskiem (wartość: 200, gotowe: fałsz) (wartość: nieokreślona, zrobione: prawda)
Oto jak działa ten program.
- Pierwsza
generator.next()
instrukcja wykonuje kod aż do pierwszej instrukcji yield i wstrzymuje wykonywanie programu. - Drugi
generator.next()
uruchamia program od pozycji wstrzymanej. - Kiedy wszystkie elementy są dostępne, zwraca (wartość: undefined, done: true).

Przekazywanie argumentów do funkcji generatora
Możesz także przekazywać argumenty do funkcji generatora. Na przykład,
// 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());
Wynik
(wartość: "witaj", gotowe: fałsz) 6 jakiś kod (wartość: 5, gotowe: fałsz) (wartość: nieokreślona, zrobione: prawda)
W powyższym programie
- Pierwsza
generator.next()
zwraca wartośćyield
(w tym przypadku „hello”). Jednak wartość nie jest przypisana do zmiennej x inlet x = yield 'hello';
(wartość: „cześć”, gotowe: fałsz)
- Po
generator.next(6)
napotkaniu kod ponownie zaczyna się od,let x = yield 'hello';
a argument 6 jest przypisywany do x. Ponadto pozostały kod jest wykonywany co do sekundyyield
.6 jakiś kod (wartość: 5, gotowe: fałsz)
- Po wykonaniu trzeciego
next()
program zwraca (wartość: undefined, done: true). Dzieje się tak, ponieważ nie ma innych instrukcji dotyczących wydajności.(wartość: undefined, done: true)
Generatory są używane do implementacji Iterables
Generatory zapewniają łatwiejszy sposób implementacji iteratorów.
Jeśli chcesz zaimplementować iterator ręcznie, musisz utworzyć iterator z next()
metodą i zapisać stan. Na przykład,
// 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); )
Wynik
1 2 3
Ponieważ generatory są iterowalne, możesz zaimplementować iterator w łatwiejszy sposób. Następnie możesz iterować przez generatory za pomocą for… of
pętli. Na przykład,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Metody generatora
metoda | Opis |
---|---|
next() | Zwraca wartość zysku |
return() | Zwraca wartość i kończy działanie generatora |
throw() | Zgłasza błąd i kończy działanie generatora |
Zwrot kodu JavaScript w porównaniu do słowa kluczowego
return Keyword | słowo kluczowe yield |
---|---|
Zwraca wartość i kończy funkcję. | Zwraca wartość i zatrzymuje funkcję, ale nie kończy funkcji. |
Dostępne zarówno w funkcji normalnej, jak i funkcji generatora. | Dostępne tylko w funkcjach generatora. |
Funkcja generatora JavaScript z funkcją powrotu
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
Możesz jawnie zgłosić błąd do funkcji generatora za pomocą metody throw (). Użycie throw()
metody generuje błąd i kończy działanie funkcji. Na przykład,
// 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());
Wynik
(wartość: 1, wykonane: fałsz) Błąd: wystąpił błąd.
Zastosowania generatorów
- Generatory pozwalają nam pisać czystszy kod podczas pisania zadań asynchronicznych.
- Generatory zapewniają łatwiejszy sposób implementacji iteratorów.
- Generatory wykonują swój kod tylko wtedy, gdy jest to wymagane.
- Generatory wydajnie wykorzystują pamięć.
Generatory zostały wprowadzone w ES6 . Niektóre przeglądarki mogą nie obsługiwać generatorów. Aby dowiedzieć się więcej, odwiedź stronę pomocy technicznej generatorów JavaScript.