Οδηγός Node.js Promise
Σε προηγούμενα σεμινάρια, θα είχατε δει συναρτήσεις επανάκλησης που χρησιμοποιούνται για Ασύγχρονα συμβάντα. Αλλά μερικές φορές οι λειτουργίες επανάκλησης μπορεί να γίνουν εφιάλτης όταν αρχίσουν να γίνονται ένθετες και το πρόγραμμα αρχίζει να γίνεται μακρύ και πολύπλοκο.
Τι είναι οι υποσχέσεις;
Πριν ξεκινήσουμε με τις υποσχέσεις, ας επανεξετάσουμε πρώτα ποιες είναι οι λειτουργίες "callback" στο Node.js. Έχουμε δει αυτές τις λειτουργίες επανάκλησης πολύ στα προηγούμενα κεφάλαια, οπότε ας δούμε γρήγορα μία από αυτές.
Το παρακάτω παράδειγμα δείχνει ένα απόσπασμα κώδικα, το οποίο χρησιμοποιείται για τη σύνδεση στο a MongoDB βάση δεδομένων και εκτελέστε μια λειτουργία ενημέρωσης σε μία από τις εγγραφές στη βάση δεδομένων.
- Στον παραπάνω κώδικα, το τμήμα της συνάρτησης(err,db) είναι γνωστό ως δήλωση μιας ανώνυμης συνάρτησης ή επανάκλησης. Όταν το MongoClient δημιουργεί μια σύνδεση με το MongoDB βάσης δεδομένων, θα επιστρέψει στη λειτουργία επανάκλησης μόλις ολοκληρωθεί η λειτουργία σύνδεσης. Έτσι, κατά μία έννοια, οι λειτουργίες σύνδεσης συμβαίνουν στο παρασκήνιο, και όταν ολοκληρωθεί, καλεί τη συνάρτηση επανάκλησης. Να θυμάστε ότι αυτό είναι ένα από τα βασικά σημεία του Node.js για να επιτρέπει πολλές λειτουργίες να γίνονται ταυτόχρονα και επομένως να μην αποκλείεται κανένας χρήστης από την εκτέλεση μιας λειτουργίας.
- Το δεύτερο μπλοκ κώδικα είναι αυτό που εκτελείται όταν πραγματικά καλείται η συνάρτηση επανάκλησης. Η λειτουργία επανάκλησης ενημερώνει απλώς μία εγγραφή στο δικό μας MongoDB βάση δεδομένων.
Τι είναι λοιπόν μια υπόσχεση; Λοιπόν, μια υπόσχεση είναι απλώς μια βελτίωση στις λειτουργίες επανάκλησης στο Node.js. Κατά τη διάρκεια του κύκλου ζωής της ανάπτυξης, μπορεί να υπάρξει μια περίπτωση όπου θα χρειαστεί να ενσωματώσετε πολλές λειτουργίες επανάκλησης μαζί. Αυτό μπορεί να γίνει κάπως ακατάστατο και δύσκολο να διατηρηθεί σε μια συγκεκριμένη χρονική στιγμή. Εν ολίγοις, μια υπόσχεση είναι μια ενίσχυση στις επανακλήσεις που στοχεύει στην ανακούφιση αυτών των προβλημάτων.
Η βασική σύνταξη μιας υπόσχεσης φαίνεται παρακάτω.
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- Το "doSomethingAync" είναι οποιαδήποτε επανάκληση ή ασύγχρονη συνάρτηση που κάνει κάποιο είδος επεξεργασίας.
- Αυτή τη φορά, κατά τον καθορισμό της επιστροφής κλήσης, υπάρχει μια τιμή που επιστρέφεται που ονομάζεται "υπόσχεση".
- Όταν επιστραφεί μια υπόσχεση, μπορεί να έχει 2 εξόδους. Αυτό ορίζεται από τη ρήτρα «τότε». Είτε η λειτουργία μπορεί να είναι επιτυχής, η οποία υποδηλώνεται με την παράμετρο "onFulfilled". Ή μπορεί να έχει ένα σφάλμα που υποδηλώνεται με την παράμετρο 'onRejected'.
Σημείωση: Έτσι, η βασική πτυχή μιας υπόσχεσης είναι η αξία επιστροφής. Δεν υπάρχει έννοια επιστροφής τιμής όταν εργάζεστε με κανονικές επιστροφές κλήσης στο Node.js. Λόγω της τιμής επιστροφής, έχουμε περισσότερο έλεγχο του τρόπου με τον οποίο μπορεί να οριστεί η συνάρτηση επανάκλησης.
Στο επόμενο θέμα, θα δούμε ένα παράδειγμα υποσχέσεων και πώς επωφελούνται από τις επανακλήσεις.
Ανακλήσεις σε υποσχέσεις
Ας δούμε τώρα ένα παράδειγμα για το πώς μπορούμε να χρησιμοποιήσουμε τις "υποσχέσεις" μέσα από μια εφαρμογή Node.js. Για να χρησιμοποιήσετε τις υποσχέσεις σε μια εφαρμογή Node.js, πρέπει πρώτα να ληφθεί και να εγκατασταθεί η λειτουργική μονάδα 'promise'.
Στη συνέχεια, θα τροποποιήσουμε τον κώδικά μας όπως φαίνεται παρακάτω, ο οποίος ενημερώνει ένα Employeename στη συλλογή 'Employee' χρησιμοποιώντας υποσχέσεις.
Βήμα 1) Εγκατάσταση των μονάδων NPM
Για να χρησιμοποιήσετε Promises μέσα από μια εφαρμογή Node JS, απαιτείται η λειτουργική μονάδα υπόσχεσης. Για να εγκαταστήσετε τη μονάδα υπόσχεσης, εκτελέστε την παρακάτω εντολή
υπόσχεση εγκατάστασης npm
Βήμα 2) Τροποποιήστε τον κώδικα ώστε να περιλαμβάνει υποσχέσεις
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(err, db) { db.collection('Employee').updateOne({ "EmployeeName": "Martin" }, { $set: { "EmployeeName": "Mohan" } }); });
Επεξήγηση κώδικα: -
- Το πρώτο μέρος είναι να συμπεριλάβουμε τη λειτουργική μονάδα 'promise' η οποία θα μας επιτρέψει να χρησιμοποιήσουμε τη λειτουργία υπόσχεσης στον κώδικά μας.
- Μπορούμε τώρα να προσαρτήσουμε τη συνάρτηση «τότε» στη συνάρτηση MongoClient.connect. Αυτό λοιπόν που κάνει αυτό είναι ότι όταν δημιουργηθεί η σύνδεση με τη βάση δεδομένων, πρέπει να εκτελέσουμε το απόσπασμα κώδικα που ορίζεται στη συνέχεια.
- Τέλος, ορίζουμε το απόσπασμα του κώδικά μας που κάνει τη δουλειά της ενημέρωσης EmployeeName του υπαλλήλου με το όνομα "Martin" σε "Mohan".
Σημείωση: -
Εάν τώρα ελέγξετε τα περιεχόμενα του MongoDB βάση δεδομένων, θα διαπιστώσετε ότι εάν υπάρχει μια εγγραφή με EmployeeName του "Martin", θα ενημερωθεί σε "Mohan".
Για να ελέγξετε ότι τα δεδομένα έχουν εισαχθεί σωστά στη βάση δεδομένων, πρέπει να εκτελέσετε τις ακόλουθες εντολές στο MongoDB
- Χρησιμοποιήστε EmployeeDB
- db.Employee.find({EmployeeName :Mohan })
Η πρώτη δήλωση διασφαλίζει ότι είστε συνδεδεμένοι στη βάση δεδομένων EmployeeDb. Η δεύτερη δήλωση αναζητά την εγγραφή που έχει το όνομα του υπαλλήλου "Mohan".
Αντιμετώπιση ένθετων υποσχέσεων
Κατά τον ορισμό των υποσχέσεων, πρέπει να σημειωθεί ότι η ίδια η μέθοδος «τότε» επιστρέφει μια υπόσχεση. Έτσι, κατά μία έννοια, οι υποσχέσεις μπορούν να είναι φωλιασμένες ή αλυσοδεμένες η μία στην άλλη.
Στο παρακάτω παράδειγμα, χρησιμοποιούμε την αλυσίδα για να ορίσουμε 2 συναρτήσεις επανάκλησης, οι οποίες εισάγουν μια εγγραφή στο MongoDB βάση δεδομένων.
(Σημείωση: Το Chaining είναι μια έννοια που χρησιμοποιείται για τη σύνδεση της εκτέλεσης μεθόδων μεταξύ τους. Ας υποθέσουμε ότι η εφαρμογή σας είχε 2 μεθόδους που ονομάζονταν "methodA" και "methodB". Και η λογική ήταν τέτοια ώστε το 'methodB' να καλείται μετά το 'methodA', τότε θα αλυσοδένετε την εκτέλεση με τέτοιο τρόπο ώστε το 'methodB' να καλείται απευθείας μετά το 'methodA').
Το βασικό πράγμα που πρέπει να σημειωθεί σε αυτό το παράδειγμα είναι ότι ο κώδικας γίνεται πιο καθαρός, ευανάγνωστος και διατηρήσιμος χρησιμοποιώντας ένθετες υποσχέσεις.
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(db) { db.collection('Employee').insertOne({ Employeeid: 4, EmployeeName: "NewEmployee" }) .then(function(db1) { db1.collection('Employee').insertOne({ Employeeid: 5, EmployeeName: "NewEmployee1" }) }) });
Επεξήγηση κώδικα: -
- Τώρα ορίζουμε 2 ρήτρες «τότε» που εκτελούνται η μία μετά την άλλη. Στην πρώτη ρήτρα τότε, περνάμε την παράμετρο 'db' που περιέχει τη σύνδεση της βάσης δεδομένων μας. Στη συνέχεια, χρησιμοποιούμε την ιδιότητα συλλογής της σύνδεσης "db" για να εισάγουμε εγγραφές στη συλλογή "Εργαζόμενος". Η μέθοδος 'insertOne' χρησιμοποιείται για την εισαγωγή του πραγματικού εγγράφου στη συλλογή Employee.
- Στη συνέχεια χρησιμοποιούμε το 2nd στη συνέχεια ρήτρα επίσης για να εισαγάγετε μια άλλη εγγραφή στη βάση δεδομένων.
Εάν τώρα ελέγξετε τα περιεχόμενα του MongoDB βάση δεδομένων, θα βρείτε τις 2 εγγραφές που έχουν εισαχθεί στο MongoDB βάση δεδομένων.
Δημιουργία προσαρμοσμένης υπόσχεσης
Μια προσαρμοσμένη υπόσχεση μπορεί να δημιουργηθεί χρησιμοποιώντας μια λειτουργική μονάδα κόμβου που ονομάζεται 'q.' Η βιβλιοθήκη 'q' πρέπει να ληφθεί και να εγκατασταθεί χρησιμοποιώντας τη διαχείριση πακέτων κόμβου. Μετά τη χρήση της βιβλιοθήκης 'q', μπορεί να κληθεί η μέθοδος "denodeify" η οποία θα κάνει οποιαδήποτε συνάρτηση να γίνει συνάρτηση που επιστρέφει μια υπόσχεση.
Στο παρακάτω παράδειγμα, θα δημιουργήσουμε μια απλή συνάρτηση που ονομάζεται «Προσθήκη» η οποία θα προσθέσει 2 αριθμούς. Θα μετατρέψουμε αυτή τη συνάρτηση σε συνάρτηση για να επιστρέψουμε μια υπόσχεση.
Μόλις γίνει αυτό, θα χρησιμοποιήσουμε την υπόσχεση που επιστρέφεται από τη συνάρτηση Προσθήκη για να εμφανίσουμε ένα μήνυμα στο console.log.
Ας ακολουθήσουμε τα παρακάτω βήματα για να δημιουργήσουμε την προσαρμοσμένη μας συνάρτηση για να επιστρέψουμε μια υπόσχεση.
Βήμα 1) Εγκατάσταση των μονάδων NPM
Για να χρησιμοποιήσετε το 'q' μέσα από μια εφαρμογή Node JS, απαιτείται η ενότητα 'q'. Για να εγκαταστήσετε τη μονάδα 'q', εκτελέστε την παρακάτω εντολή
npm εγκατάσταση q
Βήμα 2) Καθορίστε τον ακόλουθο κώδικα που θα χρησιμοποιηθεί για τη δημιουργία της προσαρμοσμένης υπόσχεσης.
Επεξήγηση κώδικα: -
- Το πρώτο bit είναι να συμπεριλάβετε τη βιβλιοθήκη 'q' χρησιμοποιώντας τη λέξη-κλειδί που απαιτείται. Χρησιμοποιώντας αυτήν τη βιβλιοθήκη, θα είμαστε σε θέση να ορίσουμε οποιαδήποτε συνάρτηση για την επιστροφή κλήσης.
- Δημιουργούμε μια συνάρτηση που ονομάζεται Προσθήκη η οποία θα προσθέσει 2 αριθμούς που ορίζονται στις μεταβλητές a και b. Το άθροισμα αυτών των τιμών θα αποθηκευτεί στη μεταβλητή c.
- Στη συνέχεια χρησιμοποιούμε τη βιβλιοθήκη q για να αποκωδικοποιήσουμε (τη μέθοδο που χρησιμοποιείται για τη μετατροπή οποιασδήποτε συνάρτησης σε συνάρτηση που θα επέστρεφε μια υπόσχεση) τη συνάρτηση Προσθήκης ή αλλιώς τη μετατροπή της συνάρτησης Προσθήκης σε συνάρτηση που επιστρέφει μια υπόσχεση.
- Τώρα καλούμε τη συνάρτηση "Προσθήκη" και μπορούμε να λάβουμε μια επιστροφή υπόσχεσης λόγω του προηγούμενου βήματος που πραγματοποιήσαμε για την αποκωδικοποίηση της συνάρτησης Προσθήκης.
- Η λέξη-κλειδί «τότε» χρησιμοποιείται προσδιορίζοντας ότι εάν η συνάρτηση εκτελεστεί με επιτυχία, τότε θα εμφανιστεί η συμβολοσειρά «Η λειτουργία προσθήκης ολοκληρώθηκε» στο console.log.
Όταν εκτελεστεί ο παραπάνω κώδικας, η έξοδος "Addition function ολοκληρωμένη" θα εμφανιστεί στο console.log όπως φαίνεται παρακάτω.
Περίληψη
- Η χρήση συναρτήσεων επανάκλησης στο Node.js έχει τα μειονεκτήματά της. Μερικές φορές κατά τη διαδικασία ανάπτυξης, η ένθετη χρήση των συναρτήσεων επανάκλησης μπορεί να κάνει τον κώδικα πιο ακατάστατο και δύσκολο να διατηρηθεί.
- Τα περισσότερα από τα ζητήματα με τις ένθετες λειτουργίες επανάκλησης μπορούν να μετριαστούν με τη χρήση υποσχέσεων και γεννητριών σε node.js
- Το Promise είναι μια τιμή που επιστρέφεται από μια ασύγχρονη συνάρτηση για να υποδείξει την ολοκλήρωση της επεξεργασίας που πραγματοποιήθηκε από την ασύγχρονη συνάρτηση.
- Οι υποσχέσεις μπορούν να είναι ένθετες μεταξύ τους για να κάνουν τον κώδικα να φαίνεται καλύτερος και ευκολότερος στη διατήρηση όταν μια ασύγχρονη συνάρτηση πρέπει να κληθεί μετά από μια άλλη ασύγχρονη συνάρτηση