Σε αυτό το σεμινάριο, θα μάθουμε για τις γεννήτριες και τις διαφορές τους με τις επιστροφές κλήσεων
Τι είναι οι γεννήτριες;
Οι γεννήτριες έχουν γίνει αρκετά διάσημες στο Node.js τα τελευταία χρόνια και αυτό πιθανώς λόγω αυτού που είναι σε θέση να κάνουν.
- Οι γεννήτριες είναι λειτουργίες εκτέλεσης που μπορούν να ανασταλούν και να συνεχιστούν αργότερα.
- Οι γεννήτριες είναι χρήσιμες όταν εκτελούν έννοιες όπως «τεμπέλη εκτέλεση». Αυτό βασικά σημαίνει ότι αναστέλλοντας την εκτέλεση και συνεχίζοντας κατά βούληση, μπορούμε να τραβήξουμε τιμές μόνο όταν χρειαστεί.
Οι γεννήτριες έχουν τις παρακάτω 2 βασικές μεθόδους
- Μέθοδος απόδοσης - Η μέθοδος απόδοσης καλείται σε μια συνάρτηση για να σταματήσει η εκτέλεση της συνάρτησης στη συγκεκριμένη γραμμή όπου καλείται η μέθοδος απόδοσης.
- Επόμενη μέθοδος - Αυτή η μέθοδος καλείται από την κύρια εφαρμογή για να συνεχίσει την εκτέλεση μιας συνάρτησης που έχει μια μέθοδο απόδοσης. Η εκτέλεση της συνάρτησης θα συνεχιστεί μέχρι την επόμενη μέθοδο απόδοσης ή μέχρι το τέλος της μεθόδου.
Ας δούμε ένα παράδειγμα για το πώς μπορούν να χρησιμοποιηθούν οι γεννήτριες.
Στο παράδειγμά μας, θα έχουμε μια απλή συνάρτηση Προσθήκη που θα προσθέσει 2 αριθμούς, αλλά θα συνεχίσουμε να σταματάμε την εκτέλεση της μεθόδου σε διαφορετικά σημεία για να δείξουμε πώς μπορούν να χρησιμοποιηθούν οι γεννήτριες.
function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();
Επεξήγηση κώδικα: -
- Το πρώτο βήμα είναι να ορίσουμε τη "λειτουργία" της γεννήτριας μας. Σημειώστε ότι αυτό γίνεται με την προσθήκη ενός "*" στη λέξη-κλειδί συνάρτησης. Στη συνέχεια, ορίζουμε μια συνάρτηση που ονομάζεται Προσθήκη που παίρνει μια παράμετρο του x.
- Η λέξη-κλειδί απόδοσης είναι συγκεκριμένη για τις γεννήτριες. Αυτό το καθιστά ένα ισχυρό κατασκεύασμα για παύση μιας λειτουργίας στη μέση οτιδήποτε. Εδώ λοιπόν, η εκτέλεση της συνάρτησης θα σταματήσει μέχρι να επικαλεστούμε την επόμενη συνάρτηση (), η οποία θα γίνει στο Βήμα 4. Σε αυτό το σημείο, η τιμή του x θα γίνει 6 και η εκτέλεση της συνάρτησης θα σταματήσει.
- Εδώ καλούμε αρχικά τη λειτουργία γεννήτριας και στέλνουμε την τιμή 5 στη συνάρτηση Προσθήκη. Αυτή η τιμή θα αντικατασταθεί στην παράμετρο x της συνάρτησης Προσθήκη.
- Μόλις καλέσουμε την επόμενη συνάρτηση (), η συνάρτηση Προσθήκη () θα συνεχίσει την εκτέλεση. Όταν η επόμενη δήλωση var y = απόδοση (null) θα εκτελεστεί, η συνάρτηση Προσθήκη () θα σταματήσει ξανά να εκτελείται.
- Τώρα αφού καλέσετε ξανά την επόμενη () συνάρτηση, θα εκτελεστούν οι επόμενες δηλώσεις και η συνδυασμένη τιμή των x = 5 και y = 6 θα προστεθεί και θα επιστραφεί.
Callbacks εναντίον γεννητριών
Οι γεννήτριες χρησιμοποιούνται για την επίλυση του προβλήματος αυτού που είναι γνωστό ως callback hell. Μερικές φορές οι συναρτήσεις επιστροφής καθίστανται τόσο ένθετες κατά την ανάπτυξη μιας εφαρμογής Node.js που καθίσταται πολύ περίπλοκη για τη χρήση συναρτήσεων επιστροφής κλήσης.
Εδώ είναι χρήσιμες οι γεννήτριες. Ένα από τα πιο κοινά παραδείγματα αυτού είναι κατά τη δημιουργία συναρτήσεων χρονοδιακόπτη.
Ας δούμε το παρακάτω παράδειγμα για το πώς οι γεννήτριες μπορούν να αποδειχθούν χρήσιμες σε σχέση με τις επιστροφές κλήσεων.
Το παράδειγμά μας θα δημιουργήσει απλώς μια απλή συνάρτηση χρονικής καθυστέρησης. Στη συνέχεια, θα θέλαμε να ονομάσουμε αυτήν τη συνάρτηση με καθυστέρηση 1000, 2000 και 3000 ms.
Βήμα 1) Ορίστε τη λειτουργία επανάκλησης με τον απαραίτητο κωδικό χρονικής καθυστέρησης.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Επεξήγηση κώδικα: -
- Εδώ δημιουργούμε μια συνάρτηση που ονομάζεται Timedelay με μια παράμετρο που ονομάζεται ptime. Αυτό θα χρειαστεί την απαραίτητη χρονική καθυστέρηση που θέλουμε να εισαγάγουμε στην αίτησή μας.
- Το επόμενο βήμα είναι απλώς να δημιουργήσετε ένα μήνυμα, το οποίο θα εμφανίζεται στον χρήστη λέγοντας ότι η εφαρμογή πρόκειται να σταματήσει για αυτούς τους πολλούς αριθμούς χιλιοστών του δευτερολέπτου.
Βήμα 2) Τώρα ας δούμε τον κώδικα εάν ενσωματώναμε επιστροφές κλήσεων. Ας υποθέσουμε ότι θέλαμε να ενσωματώσουμε τις επιστροφές κλήσεων με βάση την τιμή των 1000, 2000 και 3000 χιλιοστών του δευτερολέπτου, ο παρακάτω κώδικας δείχνει πώς θα πρέπει να τις εφαρμόσουμε χρησιμοποιώντας επιστροφές κλήσεων.
Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})
Επεξήγηση κώδικα: -
- Καλούμε το Timedelay ως επιστροφή κλήσης με 1000 ως την τιμή.
- Στη συνέχεια θέλουμε να ονομάσουμε ξανά τη συνάρτηση Timedelay με το 2000 ως τιμή.
- Τέλος, θέλουμε να καλέσουμε ξανά τη συνάρτηση Timedelay με 3000 ως τιμή.
Από τον παραπάνω κώδικα, μπορείτε να δείτε ότι γίνεται πιο ακατάστατο καθώς θέλουμε να αρχίσουμε να καλούμε τη λειτουργία πολλές φορές.
Βήμα 3) Τώρα ας δούμε πώς να εφαρμόσουμε τον ίδιο κώδικα χρησιμοποιώντας γεννήτριες. Από τον παρακάτω κώδικα μπορείτε τώρα να δείτε πόσο απλό έχει γίνει η εφαρμογή της λειτουργίας Timedelay χρησιμοποιώντας γεννήτριες.
function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}
Επεξήγηση κώδικα: -
- Πρώτα ορίζουμε μια λειτουργία γεννήτριας που θα χρησιμοποιηθεί για να καλέσουμε τη συνάρτηση Timedelay.
- Καλούμε τη συνάρτηση Yield μαζί με τη συνάρτηση Timedelay με 1000 ως τιμή παραμέτρου.
- Στη συνέχεια καλούμε τη συνάρτηση Yield μαζί με τη συνάρτηση Timedelay με το 2000 ως τιμή παραμέτρου.
- Τέλος, καλούμε τη συνάρτηση Yield μαζί με τη συνάρτηση Timedelay με 3000 ως τιμή παραμέτρου.
Περίληψη
Οι γεννήτριες μπορούν επίσης να χρησιμοποιηθούν για την ανακούφιση των προβλημάτων με ένθετες επιστροφές κλήσεων και να βοηθήσουν στην απομάκρυνση αυτού που είναι γνωστό ως κόλα επιστροφής. Οι γεννήτριες χρησιμοποιούνται για να σταματήσουν την επεξεργασία μιας συνάρτησης. Αυτό επιτυγχάνεται με τη χρήση της μεθόδου «απόδοση» στην ασύγχρονη συνάρτηση.