Creazione di Promise risolte in JavaScript
A volte potresti aver bisogno di creare una promise
già risolta. Per questo esistono
due metodi: il metodo Promise.resolve
crea una promise risolta con successo, Promise.reject
crea una promise rifiutata. Questi metodi
ricevono come parametro ciò che diventerà il risultato
o l'errore della promise rispettivamente.
Quando potremmo aver bisogno di una promise già risolta? Diamo un'occhiata a un esempio. Supponiamo di avere una funzione che accetta un numero come parametro, fa qualcosa in modo asincrono e restituisce una promise con il risultato:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Utilizzeremo la nostra funzione nel seguente modo:
func(5).then(function(res) {
console.log(res); // restituirà 25
});
Supponiamo ora di aver deciso che eseguiremo la nostra operazione asincrona solo se viene passato un numero maggiore di zero. In caso contrario il risultato della funzione dovrebbe essere zero:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // risultato zero
}
}
Tuttavia, ora risulta che la funzione restituisce
o una promise o un numero. A causa di ciò non possiamo
più applicare il metodo then al risultato
della funzione, poiché nel caso in cui la funzione
restituisca un numero otterremo un errore:
func(0).then(function(res) { // errore, applichiamo il metodo then a zero
});
Il metodo Promise.resolve ci aiuterà a risolvere il problema:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // restituiamo una promise, non un numero
}
}
Supponiamo ora di aver deciso che per lo zero passato
dobbiamo restituire zero, mentre per i numeri
minori di zero - un'eccezione. In questo il metodo
Promise.reject ci aiuterà:
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'); // restituiamo una promise rifiutata
}
}