Σε αυτό το σεμινάριο, θα μάθετε για τις γεννήτριες JavaScript με τη βοήθεια παραδειγμάτων.
Στο JavaScript, οι γεννήτριες παρέχουν έναν νέο τρόπο εργασίας με συναρτήσεις και επαναληπτικά.
Χρησιμοποιώντας μια γεννήτρια,
- μπορείτε να σταματήσετε την εκτέλεση μιας λειτουργίας από οπουδήποτε μέσα στη συνάρτηση
- και συνεχίστε να εκτελείτε κώδικα από μια στάση
Δημιουργία JavaScript Generators
Για να δημιουργήσετε μια γεννήτρια, πρέπει πρώτα να ορίσετε μια λειτουργία γεννήτριας με 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, ολοκληρώθηκε: false)
Εδώ,
- Δημιουργείται ένα αντικείμενο γεννήτριας που ονομάζεται
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());
Παραγωγή
(τιμή: "γεια", ολοκληρωμένο: false) 6 κάποιος κωδικός (τιμή: 5, ολοκληρωμένος: ψευδής) (τιμή: μη καθορισμένος, ολοκληρωμένος: αληθής)
Στο παραπάνω πρόγραμμα,
- Το πρώτο
generator.next()
επιστρέφει την τιμή τουyield
(σε αυτήν την περίπτωση, «γεια»). Ωστόσο, η τιμή δεν αντιστοιχίζεται στη μεταβλητή x inlet x = yield 'hello';
(τιμή: "γεια", ολοκληρώθηκε: false)
- Όταν
generator.next(6)
συναντηθεί, ο κώδικας ξεκινά ξανά στοlet x = yield 'hello';
και το όρισμα 6 αντιστοιχεί στο x. Επίσης, ο υπόλοιπος κώδικας εκτελείται μέχρι το δεύτεροyield
.6 κάποιος κωδικός (τιμή: 5, ολοκληρωμένος: false)
- Όταν
next()
εκτελείται το τρίτο , το πρόγραμμα επιστρέφει (τιμή: undefined, done: true). Είναι επειδή δεν υπάρχουν άλλες δηλώσεις απόδοσης.(τιμή: ακαθόριστη, ολοκληρωμένη: αληθινή)
Οι γεννήτριες χρησιμοποιούνται για την εφαρμογή Iterables
Οι γεννήτριες παρέχουν έναν ευκολότερο τρόπο υλοποίησης των επαναληπτών.
Εάν θέλετε να εφαρμόσετε έναν επαναληπτικό μη αυτόματα, πρέπει να δημιουργήσετε έναν επαναληπτικό με τη 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() | Ρίχνει ένα σφάλμα και τερματίζει τη γεννήτρια |
Επιστροφή JavaScript Vs απόδοση Λέξη-κλειδί
επιστροφή λέξης-κλειδιού | απόδοση λέξης-κλειδιού |
---|---|
Επιστρέφει την τιμή και τερματίζει τη λειτουργία. | Επιστρέφει την τιμή και σταματά τη συνάρτηση αλλά δεν τερματίζει τη συνάρτηση. |
Διατίθεται τόσο στις κανονικές όσο και στις λειτουργίες της γεννήτριας. | Διατίθεται μόνο σε λειτουργίες γεννήτριας. |
Λειτουργία γεννήτριας JavaScript με επιστροφή
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, έγινε: false) Σφάλμα: Παρουσιάστηκε σφάλμα.
Χρήσεις γεννητριών
- Οι γεννήτριες μας επιτρέπουν να γράφουμε καθαρότερο κώδικα ενώ γράφουμε ασύγχρονες εργασίες.
- Οι γεννήτριες παρέχουν έναν ευκολότερο τρόπο υλοποίησης των επαναληπτών.
- Οι γεννήτριες εκτελούν τον κωδικό του μόνο όταν απαιτείται.
- Οι γεννήτριες είναι αποδοτικές στη μνήμη.
Οι γεννήτριες εισήχθησαν στο ES6 . Ορισμένα προγράμματα περιήγησης ενδέχεται να μην υποστηρίζουν τη χρήση γεννητριών. Για να μάθετε περισσότερα, επισκεφτείτε την υποστήριξη JavaScript Generators.