Επεξήγηση υποσχέσεων JavaScript

Τι είναι μια υπόσχεση στο JavaScript;

Το JavaScript είναι μονό νήμα, που σημαίνει ότι δεν μπορούν να εκτελούνται ταυτόχρονα δύο bit σεναρίου. πρέπει να τρέχουν το ένα μετά το άλλο. Η υπόσχεση είναι ένα αντικείμενο που αντιπροσωπεύει την ενδεχόμενη ολοκλήρωση (ή αποτυχία) μιας ασύγχρονης λειτουργίας και την προκύπτουσα αξία της.

var promise = new Promise(function(resolve, reject) { // do thing, then… if (/* everything worked */) { resolve("See, it worked!"); } else { reject(Error("It broke")); } });

Υπάρχει υπόσχεση σε μία από αυτές τις πολιτείες

  • Σε εκκρεμότητα: αρχική κατάσταση, ούτε πληρούται ούτε απορρίπτεται.
  • Ολοκληρώθηκε: η λειτουργία ολοκληρώθηκε με επιτυχία.
  • Απορρίφθηκε: η λειτουργία απέτυχε.

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

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

Χρήση του «Τότε» (Promise Chaining)

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

Promise.resolve('some') .then(function(string) { // <-- This will happen after the above Promise resolves (returning the value 'some') return new Promise(function(resolve, reject) { setTimeout(function() { string += 'thing'; resolve(string); }, 1); }); }) .then(function(string) { // <-- This will happen after the above .then's new Promise resolves console.log(string); // <-- Logs 'something' to the console });

API υπόσχεσης

Υπάρχουν 4 στατικές μέθοδοι στην κατηγορία Promise:

  • Υπόσχεση. Επίλυση
  • Υπόσχεση. Απόρριψη
  • Υπόσχεση. Όλα
  • Promise.race

Οι υποσχέσεις μπορούν να δεθούν μαζί

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

var add = function(x, y) { return new Promise((resolve,reject) => { var sum = x + y; if (sum) { resolve(sum); } else { reject(Error("Could not add the two values!")); } }); }; var subtract = function(x, y) { return new Promise((resolve, reject) => { var sum = x - y; if (sum) { resolve(sum); } else { reject(Error("Could not subtract the two values!")); } }); }; // Starting promise chain add(2,2) .then((added) => { // added = 4 return subtract(added, 3); }) .then((subtracted) => { // subtracted = 1 return add(subtracted, 5); }) .then((added) => { // added = 6 return added * 2; }) .then((result) => { // result = 12 console.log("My result is ", result); }) .catch((err) => { // If any part of the chain is rejected, print the error message. console.log(err); });

Αυτό είναι χρήσιμο για την παρακολούθηση ενός παραδείγματος λειτουργικού προγραμματισμού . Δημιουργώντας συναρτήσεις για τον χειρισμό δεδομένων μπορείτε να τα συνδέσετε μαζί για να συγκεντρώσετε ένα τελικό αποτέλεσμα. Εάν σε οποιοδήποτε σημείο της αλυσίδας συναρτήσεων απορριφθεί μια τιμή, η αλυσίδα θα μεταβεί στον πλησιέστερο catch()χειριστή.

Για περισσότερες πληροφορίες σχετικά με τον λειτουργικό προγραμματισμό: Λειτουργικός προγραμματισμός

Γεννήτριες λειτουργιών

Σε πρόσφατες κυκλοφορίες, η JavaScript εισήγαγε περισσότερους τρόπους για να χειριστεί εγγενώς τις υποσχέσεις. Ένας τέτοιος τρόπος είναι η γεννήτρια λειτουργιών. Οι γεννήτριες λειτουργιών είναι "παύσιμες" λειτουργίες. Όταν χρησιμοποιούνται με τις υποσχέσεις, οι γεννήτριες μπορούν να κάνουν τη χρήση πολύ πιο εύκολη στην ανάγνωση και να εμφανίζονται "συγχρονισμένες".

const myFirstGenerator = function* () { const one = yield 1; const two = yield 2; const three = yield 3; return 'Finished!'; } const gen = myFirstGenerator();

Εδώ είναι η πρώτη μας γεννήτρια, την οποία μπορείτε να δείτε από τη function*σύνταξη. Η genμεταβλητή που δηλώσαμε δεν θα εκτελεστεί myFirstGenerator, αλλά αντίθετα "αυτή η γεννήτρια είναι έτοιμη για χρήση".

console.log(gen.next()); // Returns { value: 1, done: false }

Όταν το εκτελέσουμε gen.next(), θα διακόψει τη γεννήτρια και θα συνεχίσει. Δεδομένου ότι είναι η πρώτη φορά που το καλέσαμε gen.next(), θα τρέξει yield 1και θα σταματήσει μέχρι να καλέσουμε gen.next()ξανά. Όταν yield 1καλείται, θα μας επιστρέψει valueαυτό που έχει παραχθεί και αν είναι ή όχι η γεννήτρια done.

console.log(gen.next()); // Returns { value: 2, done: false } console.log(gen.next()); // Returns { value: 3, done: false } console.log(gen.next()); // Returns { value: 'Finished!', done: true } console.log(gen.next()); // Will throw an error

Καθώς συνεχίζουμε να το καλούμε gen.next(), θα συνεχίσει το επόμενο yieldκαι θα σταματήσει κάθε φορά. Μόλις δεν υπάρχουν άλλα yield, θα συνεχίσει να τρέχει την υπόλοιπη γεννήτρια, η οποία σε αυτήν την περίπτωση επιστρέφει απλώς 'Finished!'. Εάν καλέσετε gen.next()ξανά, θα εμφανιστεί σφάλμα καθώς η γεννήτρια έχει τελειώσει.

Τώρα, φανταστείτε εάν το καθένα yieldσε αυτό το παράδειγμα ήταν Promise, ο ίδιος ο κώδικας θα εμφανιζόταν εξαιρετικά σύγχρονος.

Το Promise.all (επαναλαμβανόμενο) είναι πολύ χρήσιμο για πολλαπλά αιτήματα σε διαφορετική πηγή

Η μέθοδος Promise.all (iterable) επιστρέφει μια μοναδική υπόσχεση που επιλύεται όταν όλες οι υποσχέσεις στο επαναληπτικό όρισμα έχουν επιλυθεί ή όταν το επαναληπτικό όρισμα δεν περιέχει υποσχέσεις. Απορρίπτει με το λόγο της πρώτης υπόσχεσης που απορρίπτει.

var promise1 = Promise.resolve(catSource); var promise2 = Promise.resolve(dogSource); var promise3 = Promise.resolve(cowSource); Promise.all([promise1, promise2, promise3]).then(function(values) { console.log(values); }); // expected output: Array ["catData", "dogData", "cowData"]

Περισσότερες πληροφορίες για τις υποσχέσεις:

  • Πώς λειτουργεί η υπόσχεση JavaScript
  • Πώς να εφαρμόσετε υποσχέσεις σε JavaScript
  • Πώς να χρησιμοποιήσετε υποσχέσεις σε JavaScript
  • Πώς να γράψετε μια υπόσχεση JavsScript