Δημιουργία εκπληρωμένων promises στο JavaScript

Μερικές φορές μπορεί να χρειαστείτε να δημιουργήσετε μια promise που έχει ήδη εκπληρωθεί. Για αυτό υπάρχουν δύο μέθοδοι: η μέθοδος Promise.resolve δημιουργεί μια επιτυχημένα εκπληρωμένη promise, η Promise.reject δημιουργεί μια απορριφθείσα promise. Ως παράμετρο αυτές οι μέθοδοι λαμβάνουν αυτό που θα γίνει το αποτέλεσμα ή το σφάλμα της promise αντίστοιχα.

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

javascriptfunction func(num) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(num * num);
    }, 3000);
  });
}

Θα χρησιμοποιούμε τη συνάρτησή μας ως εξής:

javascriptfunc(5).then(function(res) {
  console.log(res); // θα εκτυπώσει 25
});

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

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // μηδενικό αποτέλεσμα
  }
}

Ωστόσο, τώρα συμβαίνει ότι η συνάρτηση επιστρέφει είτε promise, είτε αριθμό. Εξαιτίας αυτού, δεν μπορούμε πλέον να εφαρμόσουμε τη μέθοδο then στο αποτέλεσμα της συνάρτησης, αφού στην περίπτωση που η συνάρτηση επιστρέψει αριθμό θα πάρουμε σφάλμα:

javascriptfunc(0).then(function(res) { // σφάλμα, εφαρμόζουμε τη μέθοδο then στο μηδέν
  
});

Για να διορθώσουμε το πρόβλημα μας βοηθάει η Promise.resolve:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // επιστρέφουμε promise, όχι αριθμό
  }
}

Ας υποθέσουμε τώρα ότι αποφασίσαμε ότι για το μηδέν που περάστηκε πρέπει να επιστρέψουμε μηδέν, ενώ για αριθμούς μικρότερους του μηδενός - μια εξαίρεση. Σε αυτό μας βοηθάει η μέθοδος Promise.reject:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else if (num === 0) {
    return Promise.resolve(0);
  } else {
    return Promise.reject('incorrect number'); // επιστρέφουμε μια απορριφθείσα promise
  }
}