Γεννήτριες JavaScript

Σε αυτό το σεμινάριο, θα μάθετε για τις γεννήτριες 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()ξεκινά το πρόγραμμα από τη θέση σε παύση.
  • Όταν έχετε πρόσβαση σε όλα τα στοιχεία, επιστρέφει (τιμή: μη καθορισμένη, γίνεται: αληθινή).
Εργασία της λειτουργίας της γεννήτριας σε JavaScript

Μεταβίβαση επιχειρημάτων σε λειτουργίες γεννήτριας

Μπορείτε επίσης να μεταβιβάσετε ορίσματα σε μια λειτουργία γεννήτριας. Για παράδειγμα,

 // 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.

ενδιαφέροντα άρθρα...