Izdarīto promisu izveide JavaScript
Dažreiz jums var būt nepieciešams izveidot jau
izpildītu promisu. Šim nolūkam pastāv
divas metodes: metode Promise.resolve
izveido veiksmīgi izpildītu promisu, Promise.reject
izveido noraidītu promisu. Šīs metodes kā parametru
saņem to, kas attiecīgi kļūs par promisa
rezultātu vai kļūdu.
Kad mums var būt nepieciešams jau izpildīts promiss? Apskatīsim piemēru. Pieņemsim, ka mums ir kāda funkcija, kas kā parametru saņem skaitli, kaut ko ar to dara asinhroni un atgriež promisu ar rezultātu:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Mēs izmantosim savu funkciju šādi:
func(5).then(function(res) {
console.log(res); // izvadīs 25
});
Pieņemsim, ka tagad esam nolēmuši, ka mūsu asinhrono darbību veiksim tikai tad, ja ir nodots skaitlis, kas lielāks par nulli. Pretējā gadījumā funkcijas rezultātam jābūt nullei:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nulles rezultāts
}
}
Tomēr tagad iznāk, ka funkcija atgriež
vai nu promisu, vai skaitli. Tāpēc mēs vairs
nevaram piemērot metodi then funkcijas
rezultātam, jo gadījumā, ja funkcija atgriež
skaitli, mēs saņemsim kļūdu:
func(0).then(function(res) { // kļūda, piemērojam metodi then nullei
});
Atrisināt problēmu mums palīdzē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); // atgriežam promisu, nevis skaitli
}
}
Pieņemsim, ka tagad esam nolēmuši, ka nodotajai
nullei mums jāatgriež nulle, bet skaitļiem
mazākiem par nulli - izņēmums. Šajā gadījumā mums palīdzēs
metode 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'); // atgriezīsim noraidītu promisu
}
}