Vytváranie splnených promisov v JavaScripte
Niekedy môžete potrebovať vytvoriť už
splnený promis. Na to existujú
dve metódy: metóda Promise.resolve
vytvára úspešne splnený promis, Promise.reject
vytvára zamietnutý promis. Parametrom tieto
metódy dostávajú to, čo sa stane výsledkom
alebo chybou promisu.
Kedy môžeme potrebovať už splnený promis? Pozrime sa na príklad. Nech máme nejakú funkciu, ktorá parametrom prijíma číslo, niečo s ním robí asynchrónne a vracia promis s výsledkom:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Budeme používať našu funkciu nasledovným spôsobom:
func(5).then(function(res) {
console.log(res); // vypíše 25
});
Nech sa teraz rozhodneme, že našu asynchrónnu operáciu vykonáme, iba ak je zadané číslo väčšie ako nula. V opačnom prípade výsledkom funkcie má byť nula:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nulový výsledok
}
}
Avšak teraz sa stáva, že funkcia vracia
buď promis, alebo číslo. Kvôli tomu nemôžeme
aplikovať metódu then na výsledok
funkcie, pretože v prípade návratu čísla
dostaneme chybu:
func(0).then(function(res) { // chyba, aplikujeme metódu then na nulu
});
Vyriešiť problém nám pomôže Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // vrátime promis, nie číslo
}
}
Nech sa teraz rozhodneme, že pre zadanú
nulu máme vrátiť nulu, a pre čísla
menšie ako nula - výnimku. V tom nám pomôže
metóda 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'); // vrátime zamietnutý promis
}
}