Lekcje modułu (1/4)
Obietnice: czym są
Obiekt Promise (obietnica) to wartość reprezentująca wynik operacji, która zakończy się w przyszłości. Może znajdować się w jednym z trzech stanów:
- pending — operacja jest w toku
- fulfilled — zakończyła się sukcesem, dostępna jest wartość
- rejected — zakończyła się niepowodzeniem, dostępny jest błąd
Gdy Promise opuści stan pending, staje się „rozstrzygnięty” (settled) na zawsze.
Tworzenie rozstrzygniętego Promise
Dwa najczęstsze sposoby (prawie nigdy nie będziesz tworzyć Promise „ręcznie” za pomocą konstruktora):
const p1 = Promise.resolve(42);
const p2 = Promise.reject(new Error('oops'));Odczytywanie wyniku: .then / .catch
Promise.resolve(10).then((v) => {
console.log(v); // 10
});
Promise.reject(new Error('no')).catch((e) => {
console.log(e.message); // 'no'
});.then przyjmuje funkcję, która zostanie wywołana z rozstrzygniętą wartością.
.catch przyjmuje funkcję wywoływaną z błędem w przypadku odrzucenia (rejection).
Łańcuchowanie (Concatenation)
Każde wywołanie .then zwraca z kolei nowy obiekt Promise: możesz je łączyć w łańcuchy, aby przekształcać wartość krok po kroku.
Promise.resolve(5)
.then((n) => n * 2)
.then((n) => n + 1)
.then((n) => console.log(n)); // 11Jeśli jakikolwiek krok .then rzuci błąd (lub zwróci obietnicę, która zakończy się niepowodzeniem), wykonanie przeskoczy do pierwszego następnego bloku .catch.
Konstruktor (rzadko)
const p = new Promise((resolve, reject) => {
if (Math.random() > 0.5) resolve('ok');
else reject(new Error('no'));
});Użyjesz go tylko wtedy, gdy będziesz potrzebować opakować w Promise („spromisować”) interfejs korzystający z funkcji callback (np. stare API DOM lub setTimeout).
Spróbuj sam
Zdefiniuj funkcję `promisedVersion(n)`: dla danej liczby zwraca Promise rozstrzygnięte z podwojoną wartością n.
Pokaż wskazówkę
return Promise.resolve(n * 2)
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Zdefiniuj funkcję `incrementThree(p)`: przyjmuje Promise zwracające liczbę i zwraca Promise z tą liczbą powiększoną o 3. Użyj łańcucha .then.
Pokaż wskazówkę
p.then((n) => n + 3)
Rozwiązanie dostępne po 3 próbach