Czym jest Promise w JavaScript i jak działa?
Promise w JavaScript to obiekt reprezentujący ostateczne zakończenie lub niepowodzenie operacji asynchronicznej. Pozwala na dołączanie wywołań zwrotnych do obsługi wyniku lub błędu zadania asynchronicznego, co ułatwia zarządzanie przepływem wykonywania kodu.
Jak działają Promises
Promise może być w jednym z trzech stanów:
- Pending: Stan początkowy, ani spełniony, ani odrzucony.
- Fulfilled: Operacja zakończyła się sukcesem.
- Rejected: Operacja zakończyła się niepowodzeniem.
Kiedy Promise jest tworzony, jest w stanie oczekiwania (pending). Może przejść do stanu spełnionego poprzez wywołanie funkcji resolve
, lub do stanu odrzuconego przez wywołanie funkcji reject
. Gdy Promise jest osadzony (spełniony lub odrzucony), jego stan nie może już się zmienić.
Tworzenie Promise
Oto prosty przykład tworzenia Promise:
const myPromise = new Promise((resolve, reject) => { const success = true; // Symulacja scenariusza sukcesu if (success) { resolve('Operacja zakończona sukcesem!'); } else { reject('Operacja zakończona niepowodzeniem.'); } });
Obsługa Promise
Obsługujesz wynik Promise za pomocą .then()
dla spełnienia i .catch()
dla odrzucenia:
myPromise .then((message) => { console.log('Sukces:', message); }) .catch((error) => { console.error('Błąd:', error); });
W powyższym przykładzie, jeśli wywołany zostanie resolve
, blok then
zostanie wykonany, wypisując "Sukces: Operacja zakończona sukcesem!". Jeśli wywołany zostanie reject
, blok catch
zostanie wykonany, wypisując "Błąd: Operacja zakończona niepowodzeniem.".
Łańcuchy Promises
Promises mogą być łączone w łańcuchy, aby sekwencyjnie wykonywać wiele operacji asynchronicznych. Każdy .then()
zwraca nowy Promise, umożliwiając dalsze łączenie w łańcuchy:
myPromise .then((message) => { console.log('Pierwszy:', message); return 'Następna operacja'; }) .then((nextMessage) => { console.log('Drugi:', nextMessage); }) .catch((error) => { console.error('Błąd:', error); });
W tym łańcuchu wynik jednego then
jest przekazywany do następnego, co pozwala na sekwencyjne przetwarzanie operacji asynchronicznych.
Podsumowanie
Promises w JavaScript zapewniają potężny sposób obsługi operacji asynchronicznych, oferując czystsze i bardziej zorganizowane podejście niż tradycyjne rozwiązania oparte na callbackach.