Įvykdyto pažado sukūrimas JavaScript
Kartais jums gali tekti sukurti jau
įvykdytą pažadą. Tam yra du metodai:
metodas Promise.resolve
sukuria sėkmingai įvykdytą pažadą, Promise.reject
sukuria atmestą pažadą. Šie metodai parametru
gauna tai, kas atitinkamai taps pažado
rezultatu arba klaida.
Kada mums gali prireikti jau įvykdytą pažadą? Pažiūrėkime pavyzdžiu. Tarkime, kad turime tam tikrą funkciją, kuri parametru priima skaičių, kažką su juo asinchroniškai atlieka ir grąžina pažadą su rezultatu:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Mes naudosime savo funkciją taip:
func(5).then(function(res) {
console.log(res); // išves 25
});
Tarkime, kad dabar nusprendėme, kad savo asinchroninę operaciją atliksime tik jei perduotas skaičius yra didesnis už nulį. Priešingu atveju funkcijos rezultatas turėtų būti nulis:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nulinis rezultatas
}
}
Tačiau dabar pasirodo, kad funkcija grąžina
arba pažadą, arba skaičių. Dėl to mes daugiau
nebegalime pritaikyti metodo then prie funkcijos
rezultato, nes jei funkcija grąžins
skaičių, gausime klaidą:
func(0).then(function(res) { // klaida, taikome metodą then nuliui
});
Išspręsti problemą mums padės Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // grąžiname pažadą, o ne skaičių
}
}
Tarkime, kad dabar nusprendėme, kad už perduotą
nulį turime grąžinti nulį, o už skaičius
mažesnius už nulį - išimtį. Tam mums padės
metodas 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'); // grąžinsime atmestą pažadą
}
}