Δημιουργία εκπληρωμένων promises στο JavaScript
Μερικές φορές μπορεί να χρειαστείτε να δημιουργήσετε μια promise που έχει ήδη εκπληρωθεί. Για αυτό υπάρχουν
δύο μέθοδοι: η μέθοδος Promise.resolve
δημιουργεί μια επιτυχημένα εκπληρωμένη promise, η Promise.reject
δημιουργεί μια απορριφθείσα promise. Ως παράμετρο αυτές οι
μέθοδοι λαμβάνουν αυτό που θα γίνει το αποτέλεσμα
ή το σφάλμα της promise αντίστοιχα.
Πότε μπορεί να χρειαστεί μια ήδη εκπληρωμένη promise; Ας δούμε ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε κάποια συνάρτηση που παίρνει ως παράμετρο έναν αριθμό, κάνει κάτι ασύγχρονα και επιστρέφει μια promise με το αποτέλεσμα:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Θα χρησιμοποιούμε τη συνάρτησή μας ως εξής:
func(5).then(function(res) {
console.log(res); // θα εκτυπώσει 25
});
Ας υποθέσουμε τώρα ότι αποφασίσαμε ότι την ασύγχρονη διαδικασία θα την εκτελούμε μόνο εάν περαστεί αριθμός μεγαλύτερος του μηδενός. Σε αντίθετη περίπτωση το αποτέλεσμα της συνάρτησης πρέπει να είναι μηδέν:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // μηδενικό αποτέλεσμα
}
}
Ωστόσο, τώρα συμβαίνει ότι η συνάρτηση επιστρέφει
είτε promise, είτε αριθμό. Εξαιτίας αυτού, δεν μπορούμε πλέον
να εφαρμόσουμε τη μέθοδο then στο αποτέλεσμα
της συνάρτησης, αφού στην περίπτωση που η συνάρτηση επιστρέψει
αριθμό θα πάρουμε σφάλμα:
func(0).then(function(res) { // σφάλμα, εφαρμόζουμε τη μέθοδο then στο μηδέν
});
Για να διορθώσουμε το πρόβλημα μας βοηθάει η Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // επιστρέφουμε promise, όχι αριθμό
}
}
Ας υποθέσουμε τώρα ότι αποφασίσαμε ότι για το μηδέν που περάστηκε
πρέπει να επιστρέψουμε μηδέν, ενώ για αριθμούς
μικρότερους του μηδενός - μια εξαίρεση. Σε αυτό μας βοηθάει
η μέθοδος Promise.reject:
function 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
}
}