Επανακλήσεις VS Promises VS Async / Αναμονή

Ενώ κύλησα μέσα από τους ανακοινωθέντες ομιλητές για αυτές τις εβδομάδες στο BerlinJS, διαπίστωσα ότι ο Mohamed Oun θα δώσει την πρώτη του ομιλία (καλή επιτυχία) στο τελευταίο μεγάλο hit του κόσμου JS, Async και περιμένει. Έτσι σκέφτηκα ότι θα μπορούσα να φτιάξω και τη δική μου περίληψη, ώστε να μπορώ να συγκρίνω σημειώσεις.)

Τώρα με κανένα τρόπο δεν πρόκειται να περάσει νέο έδαφος με αυτό το blog, αλλά τουλάχιστον για μένα αυτή ολόκληρη η υπόσχεση & async / αναμονή πράγμα δεν είχε νόημα μέχρι που το χρησιμοποίησα πραγματικά. Και αυτό θα κάνουμε.

Σε όσους προέρχονται από άλλες γλώσσες, οι υποσχέσεις ωφέλειας και η αναμονή για async + είναι ένας καθαρός και ευανάγνωστος τρόπος για τις λειτουργίες αλυσίδας και εφαρμόζουν αξιόπιστο και συνοπτικό έλεγχο ροής. Τίποτα περισσότερο, τίποτα λιγότερο.

Είτε παίρνετε βόλτα, ποδήλατο, είτε παίρνετε λεωφορείο, μπορείτε ακόμα να φτάσετε εκεί που θέλετε να πάτε. Το ίδιο ισχύει και για τις επαναλήψεις λειτουργίας VS Promises.

Ας το κάνουμε αυτό → Το πρόγραμμα Εγκατάστασης

Ας φανταστούμε ότι έχουμε μια εφαρμογή node.js, η οποία είναι σε θέση να δημοσιεύει δεδομένα από μια φόρμα, σε έναν ελεγκτή, ο οποίος αποθηκεύεται μέσω του Mongoose (συμπεριλαμβανομένου κάποιου middleware) στο DB μας.

Αυτό το σενάριο μας δίνει μερικές επιλογές, και τρία:

Ανακλήσεις κλήσεων

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

Ονομάζουμε functionA, και η εκτέλεση οποιωνδήποτε επακόλουθων λειτουργιών εξαρτάται από την επιστροφή της λειτουργίαςA.

Τώρα το πρόβλημα με αυτό αρχίζει να εμφανίζεται όταν έχουμε πιο σύνθετες λειτουργίες. Ίσως πρέπει να καθαρίσετε τα δεδομένα σας ή να εκτελέσετε επικυρώσεις ή να δημιουργήσετε συνδέσεις με άλλα αρχεία στο ΣΠ. Φτάνετε γρήγορα φτάνετε σε αυτό που πολλοί χρησιμοποιούν ως κόλαση.

Αρχίζουμε να χάνουμε επανάκλησης και τα πράγματα γίνονται γρήγορα δύσκολα στην ανάγνωση.

Υποσχέσεις

Μια υπόσχεση είναι ένα αντικείμενο που αντιπροσωπεύει την τελική ολοκλήρωση ή αποτυχία μιας ασύγχρονης λειτουργίας.

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

Ας υποθέσουμε ότι θέλουμε να βρούμε ένα άλλο ρεκόρ και να οικοδομήσουμε μια ένωση πριν από την εξοικονόμηση, ξέρουμε τι μπορεί να μοιάζει με τον κόσμο των callbacks, αλλά με τις υποσχέσεις καταλήγουμε με μια αλυσίδα κάπως παρόμοια με αυτή:

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

Async / Αναμονή

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

Είναι κομψό και απλό, αλλά το μόνο εμπόδιο, κατά τη γνώμη μου, είναι πώς να χειριστείτε τα σφάλματα. Οι τακτικές υποσχέσεις μας παρέχουν ένα ωραίο και εύκολο μπλοκ αλίευσης που απλοποιεί την αντιμετώπιση εξαιρέσεων και σφαλμάτων, ενώ οι λειτουργίες async δεν έχουν πραγματικά καλό τρόπο να εντοπίσουμε λάθη. Πρέπει να κάνετε κάτι τέτοιο.

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

Και εκεί το έχετε

Μια εφαρμογή των υποσχέσεων και της ασυνεχούς / αναμονής σε μια καθημερινή χρήση περίπτωση που σχεδόν κάθε προγραμματιστής έξω εκεί είναι εξοικειωμένοι. Ευχαριστώ που αφιερώσατε το χρόνο για να το διαβάσετε.

Βρήκατε λάθος; Μιλάω ανοησίες;

Ενημερώστε με αν πιστεύετε ότι έχω το λανθασμένο τέλος του ραβδιού! Είμαι άνθρωπος, κάνω λάθη, χαίρομαι που μαθαίνω από το 'em :)

Πηγές:

Είμαι στη διαδικασία παρακολούθησης της ομιλίας του Wes Bos σχετικά με το Async + Await και δεν μπορώ να το προτείνω αρκετά αν θέλετε να μάθετε περισσότερα (περιγράφει πολύ λεπτομερέστερα το χειρισμό σφαλμάτων, είναι πολύ καλό). Στην πραγματικότητα θα συνιστούσα να τον ακολουθώ γενικά (είμαι ένας τεράστιος ανεμιστήρας Wes Bos!).

Ο ιστότοπος MDN δημιουργεί έγγραφα σχετικά με τη χρήση υποσχέσεων

Ο ιστότοπος του MDB στο Async + αναμένει