Kreiranje ispunjenih promisa u JavaScript-u
Ponekad vam može zatrebati da kreirate već
ispunjen promise. Za to postoje
dve metode: metoda Promise.resolve
kreira uspešno ispunjen promise, Promise.reject
kreira odbijeni promise. Kao parametar ove
metode primaju ono što će postati rezultat
ili greška promise-a respektivno.
Kada nam može zatrebati već ispunjen promise? Pogledajmo na primeru. Neka imamo određenu funkciju koja parametrom prima broj, nešto asinhrono radi s njim i vraća promise sa rezultatom:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Koristićemo našu funkciju na sledeći način:
func(5).then(function(res) {
console.log(res); // ispisaće 25
});
Neka smo sada odlučili da ćemo našu asinhronu operaciju izvršavati samo ako je prosledjen broj veći od nule. U suprotnom rezultat funkcije treba da bude nula:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nulti rezultat
}
}
Međutim, sada se ispostavlja da funkcija vraća
ili promise, ili broj. Zbog toga više
ne možemo primeniti metodu then na rezultat
funkcije, jer u slučaju da funkcija vrati
broj dobićemo grešku:
func(0).then(function(res) { // greška, primenjujemo metodu then na nulu
});
Problem ćemo rešiti uz pomoć Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // vraćamo promise, a ne broj
}
}
Neka smo sada odlučili da za prosleđenu
nulu treba da vratimo nulu, a za brojeve
manje od nule - izuzetak. U tome će nam pomoći
metoda 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'); // vratićemo odbijeni promise
}
}