Ustvarjanje izpolnjenih promisov v JavaScript
Včasih boste morda morali ustvariti že
izpolnjen promise. Za to obstajata
dve metodi: metoda Promise.resolve
ustvari uspešno izpolnjen promise, Promise.reject
ustvari zavrnjen promise. Kot parameter ti
metodi prejmeta to, kar bo postalo rezultat
ali napaka promisa.
Kdaj lahko potrebujemo že izpolnjen promise? Poglejmo si primer. Recimo, da imamo neko funkcijo, ki kot parameter sprejme število, z njim asinhrono nekaj naredi in vrne promise z rezultatom:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Uporabljali bomo našo funkcijo na naslednji način:
func(5).then(function(res) {
console.log(res); // izpiše 25
});
Recimo, da smo se zdaj odločili, da bomo našo asinhrono operacijo izvedli le, če je posredovano število večje od nič. V nasprotnem primeru bi moral biti rezultat funkcije nič:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // ničelni rezultat
}
}
Vendar pa zdaj funkcija vrne
ali promise, ali število. Zaradi tega ne moremo
več uporabiti metode then na rezultatu
funkcije, ker bomo v primeru, da funkcija vrne
število, dobili napako:
func(0).then(function(res) { // napaka, uporabljamo metodo then na ničli
});
Rešiti težavo nam bo pomagal Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // vrnemo promise, ne število
}
}
Recimo, da smo se zdaj odločili, da za posredovano
ničlo moramo vrniti nič, za števila
manjša od nič pa izjemo. Pri tem nam bo pomagala
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'); // vrnemo zavrnjen promise
}
}