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()(lubtry/catchprzy await) da Ci cicheunhandled promise rejection, które potrafi zwalić aplikację. - Zapominanie o
await— bez niego dostajesz sam obiekt Promise zamiast wartości. Jeśli widzisz w konsoliPromise {, 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ść.