Bluebird NPM: Υπόσχεση Bluebird JS με Παράδειγμα

⚡ Έξυπνη Σύνοψη

Το Bluebird JS είναι μια πλήρως εξοπλισμένη βιβλιοθήκη Promise για JavaΣκριπτ του οποίου η καθοριστική ικανότητα είναι η υπόσχεση: μετατροπή ενοτήτων Node που βασίζονται σε επανάκληση σε ενότητες που επιστρέφουν υποσχέσεις, έτσι ώστε μια ολόκληρη βιβλιοθήκη όπως η MongoDB Το πρόγραμμα οδήγησης μπορεί να χρησιμοποιηθεί ασύγχρονα.

  • ???? Βασική δυνατότητα: Η promisifyAll αναδιπλώνει κάθε μέθοδο μιας ενότητας, προσθέτοντας ένα επίθημα Async που σηματοδοτεί ότι η μέθοδος επιστρέφει πλέον μια υπόσχεση.
  • 📦 Εγκατάσταση: Μία μόνο εντολή npm install bluebird προσθέτει τη βιβλιοθήκη, μετά την οποία η εντολή require εκθέτει το αντικείμενο Promise.
  • 🔗 Αλυσίδα: Στη συνέχεια, κάθε μία λαμβάνει την προηγούμενη τιμή ανάλυσης, η οποία αντικαθιστά τις ένθετες επανακλήσεις με μια επίπεδη ακολουθία βημάτων.
  • 🏷️ Κανόνας ονομασίας: Μόνο οι παραλλαγές με επίθημα Async επιστρέφουν υποσχέσεις. Οι αρχικές μέθοδοι επανάκλησης παραμένουν αμετάβλητες παράλληλα με αυτές.
  • Διαδρομή αποτυχίας: Ένα μόνο αλίευμα στο τέλος μιας αλυσίδας λαμβάνει απορρίψεις από κάθε προηγούμενο βήμα.
  • Σύγχρονο Πλαίσιο: Οι εγγενείς υποσχέσεις και η ασύγχρονη αναμονή καλύπτουν πλέον το μεγαλύτερο μέρος αυτών που κάποτε παρείχε μοναδικά η Bluebird.

Υποσχέσεις Bluebird JS

Τι είναι το Bluebird JS;

Το Bluebird JS είναι μια πλήρως εξοπλισμένη βιβλιοθήκη Promise για JavaΣενάριο. Το ισχυρότερο χαρακτηριστικό του είναι ότι σας επιτρέπει να "υπόσχεστε" άλλες μονάδες Node για να τις χρησιμοποιείτε ασύγχρονα. Το Promisify είναι μια έννοια που εφαρμόζεται σε συναρτήσεις επανάκλησης και διασφαλίζει ότι κάθε συνάρτηση επανάκλησης που καλείται επιστρέφει μια τιμή.

Έτσι εάν Node.js Η ενότητα περιέχει μια συνάρτηση επανάκλησης η οποία δεν επιστρέφει τιμή, υπόσχοντας ότι η ενότητα τροποποιεί αυτόματα όλες τις συναρτήσεις σε αυτήν, έτσι ώστε η καθεμία να επιστρέφει μια τιμή.

Αυτό σημαίνει ότι μπορείτε να χρησιμοποιήσετε το Bluebird για να δημιουργήσετε το MongoDB η ενότητα εκτελείται ασύγχρονα, γεγονός που προσθέτει ένα ακόμη επίπεδο ευκολίας κατά τη σύνταξη εφαρμογών Node.js.

Το παρακάτω παράδειγμα δημιουργεί πρώτα μια σύνδεση με τη συλλογή "Employee" στη βάση δεδομένων "EmployeeDB". Μόλις δημιουργηθεί η σύνδεση, ανακτά όλες τις εγγραφές της συλλογής και τις εμφανίζει στην κονσόλα.

Πώς να δημιουργήσετε υποσχέσεις με τη βιβλιοθήκη Bluebird JS

Ακολουθεί ένα βήμα προς βήμα παράδειγμα που δείχνει πώς να δημιουργήσετε υποσχέσεις με τη βιβλιοθήκη Bluebird JS.

Βήμα 1) Εγκατάσταση των μονάδων NPM

Για να χρησιμοποιήσετε το Bluebird μέσα από μια εφαρμογή Node, απαιτείται η ενότητα Bluebird. Εγκαταστήστε την με την παρακάτω εντολή:

npm install bluebird

Βήμα 2) Συμπεριλάβετε την ενότητα Bluebird

Το επόμενο βήμα είναι να συμπεριλάβετε την ενότητα Bluebird στον κώδικά σας και να υποσχεθείτε ολόκληρο το MongoDB ενότητα. Αυτό που υπόσχεται εδώ σημαίνει ότι η Bluebird διασφαλίζει ότι κάθε μέθοδος που ορίζεται στο MongoDB η βιβλιοθήκη επιστρέφει μια υπόσχεση.

Συμπεριλάβετε ενότητες Bluebird

Code Επεξήγηση:

  1. The require Η εντολή περιλαμβάνει τη βιβλιοθήκη Bluebird.
  2. Bluebird's .promisifyAll() Η μέθοδος δημιουργεί μια ασύγχρονη έκδοση κάθε μεθόδου. MongoDB παρέχει η ενότητα, έτσι ώστε κάθε μία να εκτελείται στο παρασκήνιο και να επιστρέφει μια υπόσχεση.

Βήμα 3) Σύνδεση με τη βάση δεδομένων

Το τελευταίο βήμα είναι η σύνδεση στη βάση δεδομένων, η ανάκτηση όλων των εγγραφών στη συλλογή και η εμφάνισή τους στο αρχείο καταγραφής της κονσόλας.

Σύνδεση με τη βάση δεδομένων

Code Επεξήγηση:

  1. Παρατηρήστε το connectAsync χρησιμοποιείται η μέθοδος αντί της κανονικής connect μέθοδος. Το Bluebird προσθέτει το Ασύγ επίθημα σε κάθε μέθοδο στο MongoDB βιβλιοθήκη για να διακρίνει τις κλήσεις που επιστρέφουν υποσχέσεις από εκείνες που δεν τις επιστρέφουν. Οι μέθοδοι χωρίς το επίθημα Async δεν έχουν τέτοια εγγύηση.
  2. Παρόμοια με connectAsync, findAsync Η μέθοδος επιστρέφει όλες τις εγγραφές στο MongoDB Συλλογή «Υπάλληλος».
  3. If findAsync Εάν το πρόβλημα επιλυθεί με επιτυχία, το ακόλουθο μπλοκ επαναλαμβάνεται σε κάθε εγγραφή στη συλλογή και την εμφανίζει στο αρχείο καταγραφής της κονσόλας.

Εάν τα παραπάνω βήματα εκτελεστούν σωστά, όλα τα έγγραφα στη συλλογή Employee εμφανίζονται στην κονσόλα, όπως φαίνεται στο παρακάτω αποτέλεσμα.

Η Bluebird υπόσχεται απόδοση

Εδώ είναι ο πλήρης κώδικας για αναφορά:

var Promise = require('bluebird');

// promisifyAll adds an Async variant of every MongoDB method
var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient;

mongoClient.connectAsync('mongodb://localhost/EmployeeDB')

    .then(function(db) {
        return db.collection('Employee').findAsync({});
    })
    .then(function(cursor) {
        cursor.each(function(err, doc) {
            console.log(doc);
        });
    });

⚠️ Σημείωση έκδοσης προγράμματος οδήγησης: ο παραπάνω κώδικας στοχεύει MongoDB Πρόγραμμα οδήγησης κόμβου 2.x, όπου connect επιλύεται με ένα αντικείμενο βάσης δεδομένων. Από το πρόγραμμα οδήγησης 3.0 και μετά λύνεται με ένα MongoClient, επομένως η αλυσίδα πρέπει να καλέσει client.db('EmployeeDB').collection('Employee') αντί του db.collection('Employee')Οι σύγχρονες εκδόσεις προγραμμάτων οδήγησης επιστρέφουν ήδη εγγενείς υποσχέσεις, γεγονός που καθιστά promisifyAll περιττό για MongoDB ΕΙΔΙΚΑ.

Bluebird vs Native Promises: Ποιο να χρησιμοποιήσετε

Όταν γράφτηκε για πρώτη φορά το Bluebird, το Node δεν είχε καθόλου υποστήριξη υποσχέσεων, επομένως η βιβλιοθήκη κάλυψε ένα πραγματικό κενό στην πλατφόρμα. Το Node έχει παραδώσει εγγενείς υποσχέσεις από την έκδοση 4 και μετά. async/await από την έκδοση 7.6, η οποία αλλάζει σημαντικά τον υπολογισμό για όποιον ξεκινά ένα έργο σήμερα.

Άποψη Bluebird Εγγενείς Υποσχέσεις
Εξάρτηση Ένα πακέτο npm για εγκατάσταση και συντήρηση Ενσωματωμένο στον χρόνο εκτέλεσης
Υποσχόμενες επανεκκλήσεις promisifyAll() μετατρέπει μια ολόκληρη ενότητα util.promisify() μετατρέπει μία συνάρτηση
Επιπλέον βοηθοί χάρτης, φίλτρο, στηρίγματα, κάθε, χρονικό όριο, ακύρωση όλοι, όλοιΕγκατεστημένοι, οποιαδήποτε, μόνο φυλή
Μακριά στοίβα traces Ναι, όταν είναι ενεργοποιημένο Βελτιωμένο αλλά μικρότερο
καλυτερα for Βιβλιοθήκες παλαιού τύπου επανάκλησης, βοηθοί ταυτόχρονης χρήσης Νέος κώδικας και οτιδήποτε χρησιμοποιεί ασύγχρονη λειτουργία αναμονής

Επιλέξτε εγγενείς υποσχέσεις για νέα εργασία, καθώς δεν χρειάζονται εξάρτηση και ενσωματώνονται απευθείας με την ασύγχρονη αναμονή. Επιλέξτε το Bluebird όταν μια εξάρτηση εξακολουθεί να εκθέτει μόνο επανακλήσεις ή όταν οι βοηθοί ταυτόχρονης χρήσης, όπως π.χ. Promise.map με ένα όριο ταυτόχρονης χρήσης, εξοικονομήστε μια σημαντική ποσότητα κώδικα.

Πώς να χειριστείτε σφάλματα με τις υποσχέσεις Bluebird

Το παραπάνω παράδειγμα δεν έχει διαδρομή αποτυχίας. Αν MongoDB δεν εκτελείται ή το όνομα της συλλογής είναι λανθασμένο, η αλυσίδα απορρίπτει και δεν εκτυπώνεται τίποτα — η διεργασία απλώς τερματίζεται χωρίς εξήγηση. Κάθε αλυσίδα υποσχέσεων χρειάζεται έναν χειριστή τερματικού.

Το Bluebird υποστηρίζει .catch() για απορρίψεις και .finally() για καθαρισμό που πρέπει να εκτελεστεί με οποιονδήποτε τρόπο. Υποστηρίζει επίσης πληκτρολογημένα catches, τα οποία χειρίζονται μια κατηγορία σφαλμάτων ενώ επιτρέπουν σε άλλες να διαδοθούν.

var Promise = require('bluebird');
var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient;

var connection;

mongoClient.connectAsync('mongodb://localhost/EmployeeDB')
    .then(function(db) {
        connection = db;
        return db.collection('Employee').findAsync({});
    })
    .then(function(cursor) {
        return cursor.toArrayAsync();
    })
    .then(function(docs) {
        docs.forEach(function(doc) { console.log(doc); });
    })
    .catch(Promise.TimeoutError, function(err) {
        console.error('The database did not respond in time.');
    })
    .catch(function(err) {
        // Any other rejection from any step above arrives here
        console.error('Query failed:', err.message);
    })
    .finally(function() {
        // Runs on success and on failure, so the socket always closes
        if (connection) { connection.close(); }
    });

Τρεις συνήθειες έχουν σημασία εδώ. Πρώτον, ο τόπος .catch() στο τέλος και όχι μετά από κάθε βήμα, επειδή ένας χειριστής τερματικού λαμβάνει απορρίψεις από κάθε προηγούμενο σύνδεσμο στην αλυσίδα. Δεύτερον, χρησιμοποιήστε .finally() για την απελευθέρωση πόρων όπως μια σύνδεση βάσης δεδομένων, καθώς εκτελείται τόσο στη διαδρομή επιτυχίας όσο και στη διαδρομή αποτυχίας. Τρίτον, μην αφήνετε ποτέ μια αλυσίδα χωρίς κάποιο σφάλμα: μια μη χειριζόμενη απόρριψη τερματίζει τη διεργασία Node στις τρέχουσες εκδόσεις και το Bluebird θα εκτυπώσει μια ρητή προειδοποίηση σχετικά με αυτήν εκ των προτέρων. Ενεργοποίηση μεγάλης στοίβας tracκατά την ανάπτυξη με Promise.config({ longStackTraces: true }) καθιστά πολύ πιο εύκολο τον εντοπισμό της πηγής μιας απόρριψης.

Συνηθισμένα σφάλματα και διορθώσεις του Bluebird Promisify

Τα περισσότερα προβλήματα του Bluebird προέρχονται από τη σύμβαση ονομασίας promisified ή από την ανάμειξη των στυλ κλήσης επανάκλησης και κλήσης promise στην ίδια αλυσίδα, και όχι από κάποιο σφάλμα στην ίδια τη βιβλιοθήκη. Κάθε σύμπτωμα παρακάτω αναφέρει την αιτία και τη λύση του.

  • «Το connectAsync δεν είναι συνάρτηση»: η ενότητα απαιτήθηκε απευθείας αντί μέσω promisifyAll(), επομένως δεν υπάρχουν παραλλαγές Async. Τυλίξτε την κλήση require όπως φαίνεται παραπάνω.
  • Κλήση της απλής μεθόδου και απροσδιόριστη μετάβαση: connect() εξακολουθεί να αναμένει επανάκληση. Μόνο το αντίγραφο με επίθημα Async επιστρέφει μια υπόσχεση.
  • Διαβίβαση μιας επανάκλησης σε μια μέθοδο Async: δεν παρέχει ούτε επανάκληση ούτε await και η υπόσχεση λύνεται απαρατήρητη. Χρησιμοποιήστε ένα στυλ ανά κλήση, όχι και τα δύο.
  • promisifyAll σε μια βιβλιοθήκη που βασίζεται ήδη σε promisify: ακίνδυνο αλλά άσκοπο, και παράγει μπερδεμένα ονόματα με διπλό επίθημα. Ελέγξτε πρώτα την τεκμηρίωση της βιβλιοθήκης.
  • Χάνοντας λάθη σιωπηλά: μια αλυσίδα χωρίς .catch() Αποκρύπτει την αιτία απόρριψης μέχρι ο κόμβος να αναφέρει μια μη επεξεργασμένη απόρριψη και να τερματίζει. Πάντα να τερματίζει την αλυσίδα με ένα catch, ακόμα και σε σύντομα σενάρια.

Συχνές Ερωτήσεις

Το promisifyAll προσθέτει ένα αντίγραφο κάθε μεθόδου αντί να την αντικαθιστά, επομένως η αρχική έκδοση επανάκλησης συνεχίζει να λειτουργεί. Το επίθημα Async σηματοδοτεί το αντίγραφο που επιστρέφει την υπόσχεση. Το επίθημα μπορεί να διαμορφωθεί μέσω της επιλογής promisifier.

Ναι. Οι υποσχέσεις της Bluebird συμμορφώνονται με τις προδιαγραφές Promises/A+, επομένως οι υποσχέσεις της Bluebird είναι συμβατές με τις προδιαγραφές Promises/A+, επομένως. await τα δέχεται ακριβώς όπως τα εγγενή. Αυτό σας επιτρέπει να υποσχεθείτε μια παλαιότερη λειτουργική μονάδα και στη συνέχεια να την καταναλώσετε με σύγχρονη σύνταξη.

Ναί. AI Οι βοηθοί επανεγγράφουν τις ένθετες επιστροφές κλήσεων σε αλυσίδες υποσχέσεων ή σε ασύγχρονη αναμονή με αξιοπιστία. Επαληθεύστε τον χειρισμό σφαλμάτων στη συνέχεια, επειδή οι δημιουργούμενες μετατροπές συχνά παραβιάζουν το catch του τερματικού.

εργαλεία ΤΝ tracε. ποιος κρίκος σε μια αλυσίδα δεν έχει εντολή return, η συνήθης αιτία απόρριψης escapingΕπίσης, επισημαίνουν αλυσίδες που λείπει ένα σημείο σύνδεσης τερματικού, το οποίο μετατρέπει ένα χειρισμένο σφάλμα σε σφάλμα.

Το Promise.all περιμένει μια υπάρχουσα συστοιχία υποσχέσεων. Το Promise.map του Bluebird τις δημιουργεί από τιμές και δέχεται ένα όριο ταυτόχρονης λειτουργίας, το οποίο αποτρέπει την εξάντληση των υποδοχών από χιλιάδες ταυτόχρονα αιτήματα.

Συνοψίστε αυτήν την ανάρτηση με: