Οδηγός Node.js Promise
⚡ Έξυπνη Σύνοψη
Οι υποσχέσεις στο Node.js αντικαθιστούν τις βαθιά ένθετες επανακλήσεις με ένα αντικείμενο που επιστρέφεται και σταθεροποιείται μία φορά, επομένως η ασύγχρονη εργασία στη βάση δεδομένων διαβάζεται ως μια επίπεδη αλυσίδα από όρους "then" αντί για μια πυραμίδα από ανώνυμες συναρτήσεις.
Σε προηγούμενα σεμινάρια, θα είχατε δει συναρτήσεις επανάκλησης που χρησιμοποιούνται για Ασύγχρονα συμβάντα. Αλλά μερικές φορές οι λειτουργίες επανάκλησης μπορεί να γίνουν εφιάλτης όταν αρχίσουν να γίνονται ένθετες και το πρόγραμμα αρχίζει να γίνεται μακρύ και πολύπλοκο.
Τι είναι οι υποσχέσεις;
Πριν ξεκινήσουμε με τις υποσχέσεις, ας επανεξετάσουμε πρώτα τι είναι οι συναρτήσεις "επανάκλησης" στο Node.jsΈχουμε δει αυτές τις συναρτήσεις επανάκλησης πολύ στα προηγούμενα κεφάλαια, οπότε ας δούμε γρήγορα μία από αυτές.
Το παρακάτω παράδειγμα δείχνει ένα απόσπασμα κώδικα, το οποίο χρησιμοποιείται για τη σύνδεση στο a MongoDB βάση δεδομένων και εκτελέστε μια λειτουργία ενημέρωσης σε μία από τις εγγραφές στη βάση δεδομένων.
- Στον παραπάνω κώδικα, το τμήμα της συνάρτησης(err,db) είναι γνωστό ως δήλωση μιας ανώνυμης συνάρτησης ή επανάκλησης. Όταν το MongoClient δημιουργεί μια σύνδεση με το MongoDB βάσης δεδομένων, θα επιστρέψει στη λειτουργία επανάκλησης μόλις ολοκληρωθεί η λειτουργία σύνδεσης. Έτσι, κατά μία έννοια, οι λειτουργίες σύνδεσης συμβαίνουν στο παρασκήνιο, και όταν ολοκληρωθεί, καλεί τη συνάρτηση επανάκλησης. Να θυμάστε ότι αυτό είναι ένα από τα βασικά σημεία του Node.js για να επιτρέπει πολλές λειτουργίες να γίνονται ταυτόχρονα και επομένως να μην αποκλείεται κανένας χρήστης από την εκτέλεση μιας λειτουργίας.
- Το δεύτερο μπλοκ κώδικα είναι αυτό που εκτελείται όταν πραγματικά καλείται η συνάρτηση επανάκλησης. Η λειτουργία επανάκλησης ενημερώνει απλώς μία εγγραφή στο δικό μας MongoDB βάση δεδομένων.
Τι είναι λοιπόν μια υπόσχεση; Λοιπόν, μια υπόσχεση είναι απλώς μια βελτίωση στις λειτουργίες επανάκλησης στο Node.js. Κατά τη διάρκεια του κύκλου ζωής της ανάπτυξης, μπορεί να υπάρξει μια περίπτωση όπου θα χρειαστεί να ενσωματώσετε πολλές λειτουργίες επανάκλησης μαζί. Αυτό μπορεί να γίνει κάπως ακατάστατο και δύσκολο να διατηρηθεί σε μια συγκεκριμένη χρονική στιγμή. Εν ολίγοις, μια υπόσχεση είναι μια ενίσχυση στις επανακλήσεις που στοχεύει στην ανακούφιση αυτών των προβλημάτων.
Η βασική σύνταξη μιας υπόσχεσης φαίνεται παρακάτω.
var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
- Το "doSomethingAync" είναι οποιαδήποτε επανάκληση ή ασύγχρονη συνάρτηση που κάνει κάποιο είδος επεξεργασίας.
- Αυτή τη φορά, κατά τον καθορισμό της επιστροφής κλήσης, υπάρχει μια τιμή που επιστρέφεται που ονομάζεται "υπόσχεση".
- Όταν επιστραφεί μια υπόσχεση, μπορεί να έχει 2 εξόδους. Αυτό ορίζεται από τη ρήτρα «τότε». Είτε η λειτουργία μπορεί να είναι επιτυχής, η οποία υποδηλώνεται με την παράμετρο "onFulfilled". Ή μπορεί να έχει ένα σφάλμα που υποδηλώνεται με την παράμετρο 'onRejected'.
A υπόσχεση βρίσκεται σε μία από τις τρεις καταστάσεις και εγκαθίσταται μία φορά:
| Κατάσταση | Νόημα |
|---|---|
| εκκρεμής | Η εργασία δεν έχει ολοκληρωθεί. |
| Εκπληρωμένη | Η συνάρτηση onFulfilled εκτελείται με την τιμή. |
| Απορρίπτεται | Η συνάρτηση onRejected εκτελείται με το σφάλμα. |
Σημείωση: Έτσι, η βασική πτυχή μιας υπόσχεσης είναι η αξία επιστροφής. Δεν υπάρχει έννοια επιστροφής τιμής όταν εργάζεστε με κανονικές επιστροφές κλήσης στο Node.js. Λόγω της τιμής επιστροφής, έχουμε περισσότερο έλεγχο του τρόπου με τον οποίο μπορεί να οριστεί η συνάρτηση επανάκλησης.
Σημείωση έκδοσης: Αυτά τα παραδείγματα εξακολουθούν να εκτελούνται στο Node.js 24, τη γραμμή Active LTS το 2026. Από το Node.js 15 και ανεξέλεγκτη απόρριψη τερματίζει τη διαδικασία αντί να εκτυπώνει μια προειδοποίηση, επομένως κλείστε κάθε αλυσίδα με .catch().
Στο επόμενο θέμα, θα δούμε ένα παράδειγμα υποσχέσεων και πώς επωφελούνται από τις επανακλήσεις.
Ανακλήσεις σε υποσχέσεις
Ας δούμε τώρα ένα παράδειγμα για το πώς μπορούμε να χρησιμοποιήσουμε τις "υποσχέσεις" μέσα από μια εφαρμογή Node.js. Για να χρησιμοποιήσετε τις υποσχέσεις σε μια εφαρμογή Node.js, πρέπει πρώτα να ληφθεί και να εγκατασταθεί η λειτουργική μονάδα 'promise'.
Στη συνέχεια, θα τροποποιήσουμε τον κώδικά μας όπως φαίνεται παρακάτω, ο οποίος ενημερώνει ένα Όνομα_Εργαζομένου στη συλλογή 'Εργαζόμενος' χρησιμοποιώντας υποσχέσεις.
Βήμα 1) εγκατάσταση του Ενότητες NPM
Για να χρησιμοποιήσετε τις Υποσχέσεις μέσα από μια εφαρμογή Node.js, απαιτείται η ενότητα promise. Για να εγκαταστήσετε τη ενότητα promise, εκτελέστε την παρακάτω εντολή
υπόσχεση εγκατάστασης 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" } }); });
Code Επεξήγηση:
- Το πρώτο μέρος είναι να συμπεριλάβουμε τη λειτουργική μονάδα 'promise' η οποία θα μας επιτρέψει να χρησιμοποιήσουμε τη λειτουργία υπόσχεσης στον κώδικά μας.
- Μπορούμε τώρα να προσαρτήσουμε τη συνάρτηση «τότε» στη συνάρτηση MongoClient.connect. Αυτό λοιπόν που κάνει αυτό είναι ότι όταν δημιουργηθεί η σύνδεση με τη βάση δεδομένων, πρέπει να εκτελέσουμε το απόσπασμα κώδικα που ορίζεται στη συνέχεια.
- Τέλος, ορίζουμε το απόσπασμα του κώδικά μας που κάνει τη δουλειά της ενημέρωσης EmployeeName του υπαλλήλου με το όνομα "Martin" σε "Mohan".
Σημείωση:
Εάν τώρα ελέγξετε τα περιεχόμενα του MongoDB βάση δεδομένων, θα διαπιστώσετε ότι εάν υπάρχει μια εγγραφή με EmployeeName του "Martin", θα ενημερωθεί σε "Mohan".
Για να ελέγξετε ότι τα δεδομένα έχουν εισαχθεί σωστά στη βάση δεδομένων, πρέπει να εκτελέσετε τις ακόλουθες εντολές στο MongoDB
- χρήση EmployeeDB
- db.Employee.find({ΌνομαΥπαλλήλου: “Μόχαν”})
Η πρώτη δήλωση διασφαλίζει ότι είστε συνδεδεμένοι στη βάση δεδομένων 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" }) }) });
Code Επεξήγηση:
- Τώρα ορίζουμε 2 ρήτρες «τότε» που εκτελούνται η μία μετά την άλλη. Στην πρώτη ρήτρα τότε, περνάμε την παράμετρο 'db' που περιέχει τη σύνδεση της βάσης δεδομένων μας. Στη συνέχεια, χρησιμοποιούμε την ιδιότητα συλλογής της σύνδεσης "db" για να εισάγουμε εγγραφές στη συλλογή "Εργαζόμενος". Η μέθοδος 'insertOne' χρησιμοποιείται για την εισαγωγή του πραγματικού εγγράφου στη συλλογή Employee.
- Στη συνέχεια χρησιμοποιούμε το 2nd στη συνέχεια ρήτρα επίσης για να εισαγάγετε μια άλλη εγγραφή στη βάση δεδομένων.
Εάν τώρα ελέγξετε τα περιεχόμενα του MongoDB βάση δεδομένων, θα βρείτε τις 2 εγγραφές που έχουν εισαχθεί στη MongoDB βάση δεδομένων.
Σύγχρονο ισοδύναμο: Τα async και await, στάνταρ από το ES2017, καταναλώνουν αυτές τις υποσχέσεις χωρίς στη συνέχεια επανακλήσεις και έχουν σε μεγάλο βαθμό αντικαταστήσει με βάση τη γεννήτρια Βιβλιοθήκες ελέγχου ροής όπως η co, ενώ η εγγενής υποστήριξη Promise καθιστά τα q και bluebird περιττά. Το δεύτερο μπλοκ δείχνει ότι τότε λαμβάνεται μόνο βάση δεδομένων.
Δημιουργία προσαρμοσμένης υπόσχεσης
Μια προσαρμοσμένη υπόσχεση μπορεί να δημιουργηθεί χρησιμοποιώντας μια ενότητα Node.js που ονομάζεται 'q'. Η βιβλιοθήκη 'q' πρέπει να ληφθεί και να εγκατασταθεί χρησιμοποιώντας το Node Package Manager. Μετά τη χρήση της βιβλιοθήκης 'q', μπορεί να κληθεί η μέθοδος "denodeify", η οποία θα κάνει οποιαδήποτε συνάρτηση να μετατραπεί σε συνάρτηση που επιστρέφει μια υπόσχεση.
Στο παρακάτω παράδειγμα, θα δημιουργήσουμε μια απλή συνάρτηση που ονομάζεται «Προσθήκη» η οποία θα προσθέσει 2 αριθμούς. Θα μετατρέψουμε αυτή τη συνάρτηση σε συνάρτηση για να επιστρέψουμε μια υπόσχεση.
Μόλις γίνει αυτό, θα χρησιμοποιήσουμε την υπόσχεση που επιστρέφεται από τη συνάρτηση Προσθήκη για να εμφανίσουμε ένα μήνυμα στο console.log.
Ας ακολουθήσουμε τα παρακάτω βήματα για να δημιουργήσουμε την προσαρμοσμένη μας συνάρτηση για να επιστρέψουμε μια υπόσχεση.
Βήμα 1) Εγκατάσταση των μονάδων NPM
Για να χρησιμοποιήσετε το 'q' μέσα από μια εφαρμογή Node.js, απαιτείται η ενότητα 'q'. Για να εγκαταστήσετε την ενότητα 'q', εκτελέστε την παρακάτω εντολή
npm εγκατάσταση q
Βήμα 2) Καθορίστε τον ακόλουθο κώδικα που θα χρησιμοποιηθεί για τη δημιουργία της προσαρμοσμένης υπόσχεσης.
Code Επεξήγηση:
- Το πρώτο bit είναι να συμπεριλάβετε τη βιβλιοθήκη 'q' χρησιμοποιώντας τη λέξη-κλειδί που απαιτείται. Χρησιμοποιώντας αυτήν τη βιβλιοθήκη, θα είμαστε σε θέση να ορίσουμε οποιαδήποτε συνάρτηση για την επιστροφή κλήσης.
- Δημιουργούμε μια συνάρτηση που ονομάζεται Προσθήκη η οποία θα προσθέσει 2 αριθμούς που ορίζονται στις μεταβλητές a και b. Το άθροισμα αυτών των τιμών θα αποθηκευτεί στη μεταβλητή c.
- Στη συνέχεια, χρησιμοποιούμε τη βιβλιοθήκη q για να αποδιαμορφώσουμε (η μέθοδος που χρησιμοποιείται για τη μετατροπή οποιασδήποτε συνάρτησης σε συνάρτηση που θα επέστρεφε μια υπόσχεση) τη συνάρτηση Add ή, με άλλα λόγια, να μετατρέψουμε τη συνάρτηση Add σε μια συνάρτηση που επιστρέφει μια υπόσχεση.
- Τώρα καλούμε τη συνάρτηση "Προσθήκη" και μπορούμε να λάβουμε μια επιστροφή υπόσχεσης λόγω του προηγούμενου βήματος που πραγματοποιήσαμε για την αποκωδικοποίηση της συνάρτησης Προσθήκης.
- Η λέξη-κλειδί 'then' χρησιμοποιείται για να καθορίσει ότι εάν η συνάρτηση εκτελεστεί με επιτυχία, τότε θα εμφανιστεί η συμβολοσειρά "Addition function completed" (Ολοκληρώθηκε η συνάρτηση πρόσθεσης) στο console.log.
Όταν εκτελεστεί ο παραπάνω κώδικας, η έξοδος "Addition function ολοκληρωμένη" θα εμφανιστεί στο console.log όπως φαίνεται παρακάτω.





