Vytváření okamžitě splněných promisů v JavaScriptu
Někdy může být potřeba vytvořit již
splněný promis. K tomu existují
dvě metody: metoda Promise.resolve
vytváří úspěšně splněný promis, Promise.reject
vytváří zamítnutý promis. Parametrem tyto
metody přijímají to, co se stane výsledkem
nebo chybou promisu.
Kdy může být potřeba již splněný promis? Podívejme se na příklad. Předpokládejme, že máme nějakou funkci, která parametrem přijímá číslo, něco s ním asynchronně dělá a vrací promis s výsledkem:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Naší funkcí budeme používat následujícím způsobem:
func(5).then(function(res) {
console.log(res); // vypíše 25
});
Předpokládejme nyní, že jsme se rozhodli, že naši asynchronní operaci provedeme pouze pokud je předáno číslo větší než nula. V opačném případě výsledkem funkce má být nula:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nulový výsledek
}
}
Avšak nyní se stane, že funkce vrací
buď promis, nebo číslo. Kvůli tomu již
nemůžeme aplikovat metodu then na výsledek
funkce, protože v případě vrácení
číslo funkci dostaneme chybu:
func(0).then(function(res) { // chyba, aplikujeme metodu then na nulu
});
Vyřešit 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); // vracíme promis, ne číslo
}
}
Předpokládejme nyní, že jsme se rozhodli, že pro předanou
nulu máme vrátit nulu, a pro čísla
menší než nula - výjimku. S tím nám pomůže
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'); // vrátíme zamítnutý promis
}
}