Promise

Obiekt w JavaScripcie reprezentujący wynik operacji asynchronicznej, który będzie dostępny w przyszłości. Może zakończyć się sukcesem lub błędem.

Promise (po polsku „obietnica”) to obiekt w JavaScripcie, który reprezentuje wynik operacji asynchronicznej — czegoś, co dopiero się policzy, pobierze albo zapisze. W momencie tworzenia Promise zwykle nie ma jeszcze wartości, ale „obiecuje”, że ją dostarczy: albo skończy się sukcesem (stan fulfilled), albo błędem (stan rejected). Dopóki nic się nie rozstrzygnęło, jest w stanie pending. To trochę jak numerek z kolejki w urzędzie — nie masz jeszcze odpowiedzi, ale masz pewność, że kiedyś ją dostaniesz.

Jak to działa

Promise ma trzy stany i przechodzi z pending dokładnie raz — do fulfilled albo rejected. Tej zmiany nie da się cofnąć ani powtórzyć. Wynik odbierasz metodami .then() (sukces), .catch() (błąd) i .finally() (zawsze, niezależnie od wyniku). Najważniejsze: kod po Promise nie blokuje reszty programu. Wysyłasz zapytanie do API, a JavaScript leci dalej i wraca do obsługi wyniku, gdy ten będzie gotowy.

Promisy można łączyć w łańcuchy — każdy .then() zwraca nowy Promise, więc kolejne kroki ustawiasz jeden po drugim, bez zagnieżdżania callbacków (to słynne „callback hell”, które Promisy miały rozwiązać). Na co dzień częściej spotkasz składnię async/await, która jest tylko ładniejszym ubraniem na te same Promisy.

Przykład z praktyki

Klasyka to pobranie danych przez fetch(), które samo zwraca Promise:

fetch('https://api.example.com/users').then(res => res.json()).then(data => console.log(data)).catch(err => console.error('Padło:', err));

To samo z async/await czyta się jak zwykły kod od góry do dołu:

try { const res = await fetch(url); const data = await res.json(); } catch (err) { console.error(err); }

Gdy chcesz odpalić kilka operacji równolegle i poczekać na wszystkie, użyj Promise.all([...]). A jeśli wystarczy Ci pierwszy wynik, który wpadnie — jest Promise.race().

Częste błędy

  • Brak obsługi błędu — Promise bez .catch() (lub try/catch przy await) da Ci ciche unhandled promise rejection, które potrafi zwalić aplikację.
  • Zapominanie o await — bez niego dostajesz sam obiekt Promise zamiast wartości. Jeśli widzisz w konsoli Promise { }, to właśnie to.
  • Mylenie z wielowątkowością — Promise nie tworzy nowego wątku. JavaScript dalej jest jednowątkowy, a asynchroniczność ogarnia event loop.

Pojęcia powiązane: async/await, callback, event loop, fetch, then/catch, Promise.all, asynchroniczność.