Crearea promisiunilor rezolvate în JavaScript
Uneori ai putea avea nevoie să creezi o promisiune
deja rezolvată. Pentru aceasta există
două metode: metoda Promise.resolve
crează o promisiune rezolvată cu succes, Promise.reject
crează o promisiune respinsă. Ca parametru, aceste
metode primesc ceea ce va deveni rezultatul
sau eroarea promisiunii, respectiv.
Când am putea avea nevoie de o promisiune deja rezolvată? Să ne uităm la un exemplu. Să presupunem că avem o funcție care primește un număr ca parametru, face ceva cu el în mod asincron și returnează o promisiune cu rezultatul:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Vom folosi funcția noastră în felul următor:
func(5).then(function(res) {
console.log(res); // va afișa 25
});
Să presupunem acum că am decis că operația noastră asincronă o vom efectua doar dacă este transmis un număr mai mare decât zero. În caz contrar, rezultatul funcției ar trebui să fie zero:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // rezultat zero
}
}
Cu toate acestea, acum rezultă că funcția returnează
fie o promisiune, fie un număr. Din această cauză, nu mai
putem aplica metoda then rezultatului
funcției, deoarece în cazul în care funcția returnează
un număr, vom obține o eroare:
func(0).then(function(res) { // eroare, aplicăm metoda then la zero
});
Metoda Promise.resolve ne va ajuta să remediem problema:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // returnăm o promisiune, nu un număr
}
}
Să presupunem acum că am decis că pentru zero transmis
trebuie să returnăm zero, iar pentru numere
mai mici decât zero - o excepție. Metoda
Promise.reject ne va ajuta în acest sens:
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'); // returnăm o promisiune respinsă
}
}