Przejdź do głównej treści
eLearner.app
Moduł 7 · Lekcja 1 z 425/32 w kursie~12 min
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):

JS
const p1 = Promise.resolve(42);
const p2 = Promise.reject(new Error('oops'));

Odczytywanie wyniku: .then / .catch

JS
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.

JS
Promise.resolve(5)
  .then((n) => n * 2)
  .then((n) => n + 1)
  .then((n) => console.log(n)); // 11

Jeś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)

JS
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

Ćwiczenie#js.m7.l1.e1
Próby: 0Ładowanie...

Zdefiniuj funkcję `promisedVersion(n)`: dla danej liczby zwraca Promise rozstrzygnięte z podwojoną wartością n.

Ładowanie edytora...
Pokaż wskazówkę

return Promise.resolve(n * 2)

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#js.m7.l1.e2
Próby: 0Ładowanie...

Zdefiniuj funkcję `incrementThree(p)`: przyjmuje Promise zwracające liczbę i zwraca Promise z tą liczbą powiększoną o 3. Użyj łańcucha .then.

Ładowanie edytora...
Pokaż wskazówkę

p.then((n) => n + 3)

Rozwiązanie dostępne po 3 próbach