Täidetud lubaduste loomine JavaScriptis
Mõnikord võib teil olla vaja luua juba
täidetud lubadust. Selleks on olemas
kaks meetodit: meetod Promise.resolve
loob edukalt täidetud lubaduse, Promise.reject
loob tagasi lükatud lubaduse. Parameetritena saavad need
meetodid selle, mis saab lubaduse
tulemuseks või veaks vastavalt.
Millal võib meil vaja minna juba täidetud lubadust? Vaatame näidet. Oletame, et meil on mingi funktsioon, mis parameetrina võtab arvu, teeb sellega midagi asünkroonselt ja tagastab lubaduse tulemusega:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Me kasutame oma funktsiooni järgneval viisil:
func(5).then(function(res) {
console.log(res); // väljastab 25
});
Oletame nüüd, et otsustasime, et oma asünkroonset operatsiooni teostame ainult siis, kui on antud arv suurem kui null. Vastasel juhul peab funktsiooni tulemus olema null:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // null tulemus
}
}
Siiski nüüd selgub, et funktsioon tagastab
kas lubaduse või arvu. Tänu sellele me enam
ei saa rakendada meetodit then funktsiooni
tulemusele, sest funktsiooni tagastusel
arvu saame vea:
func(0).then(function(res) { // viga, rakendame meetodit then nullile
});
Probleemi parandamiseks aitab meil Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // tagastame lubaduse, mitte arvu
}
}
Oletame nüüd, et otsustasime, et edastatud
nulli puhul peame tagastama nulli, aga arvude
puhul väiksem kui null - erandi. Sellest aitab meil
meetod 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'); // tagastame tagasi lükatud lubaduse
}
}