Tworzenie spełnionych promisów w JavaScript
Czasami może zaistnieć potrzeba utworzenia już
wykonanego promisa. Służą do tego
dwie metody: metoda Promise.resolve
tworzy pomyślnie spełniony promis, Promise.reject
tworzy odrzucony promis. Parametrem te
metody otrzymują to, co stanie się wynikiem
lub błędem promisa odpowiednio.
Kiedy może nam być potrzebny już wykonany promis? Spójrzmy na przykład. Załóżmy że mamy pewną funkcję, która parametrem przyjmuje liczbę, robi z nią coś asynchronicznie i zwraca promis z wynikiem:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Będziemy używać naszej funkcji w następujący sposób:
func(5).then(function(res) {
console.log(res); // wypisze 25
});
Załóżmy teraz, że zdecydowaliśmy, że naszą asynchroniczną operację będziemy wykonywać tylko jeśli przekazano liczbę większą od zera. W przeciwnym razie wynikiem funkcji powinno być zero:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // wynik zerowy
}
}
Jednakże teraz wychodzi na to, że funkcja zwraca
albo promis, albo liczbę. Z tego powodu nie możemy
dłużej zastosować metody then do wyniku
funkcji, ponieważ w przypadku zwrócenia przez funkcję
liczby otrzymamy błąd:
func(0).then(function(res) { // błąd, stosujemy metodę then do zera
});
Naprawić problem pomoże nam Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // zwracamy promis, a nie liczbę
}
}
Załóżmy teraz, że zdecydowaliśmy, że dla przekazanego
zera powinniśmy zwrócić zero, a dla liczb
mniejszych od zera - wyjątek. W tym pomoże nam
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'); // zwrócimy odrzucony promis
}
}