Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Promise — to obiekt, który reprezentuje wynik operacji asynchronicznej. Umożliwiają one pracę z opóźnionymi wynikami bez zagnieżdżonych callbacków, co sprawia, że kod jest bardziej czytelny. Wcześniej napisałem już mały wpis na temat czym jest Promise. Ale teraz przyjrzymy się strukturze i niektórym metodom.
Jak wygląda struktura Promise
Promise tworzy się za pomocą konstruktora new Promise(), któremu przekazywana jest funkcja z dwoma argumentami: resolve i reject. To właśnie tę strukturę należy zapamiętać. Przyjrzyjmy się przykładzie:
const promise = new Promise((resolve, reject) => {
const success = Math.random() > 0.5;
setTimeout(() => {
if (success) {
resolve("Operacja zakończona pomyślnie");
} else {
reject("Wystąpił błąd");
}
}, 1000);
});
Ten kod tworzy obietnicę, która po sekundzie (timeout 1000) albo zostaje rozwiązana (resolve) z ciągiem "Operacja zakończona pomyślnie", albo odrzucana (reject) z komunikatem o błędzie. Oznacza to, że stworzyliśmy emulację odpowiedzi success, poczekaliśmy sekundę i otrzymaliśmy wynik, który zależał od naszej losowej wartości w success.
Praca z Promise
Promise ma metody .then(), .catch() i .finally() do obsługi wyników.
promise
.then(result => {
console.log("Sukces:", result);
})
.catch(error => {
console.log("Błąd:", error);
})
.finally(() => {
console.log("Operacja zakończona");
});
Tutaj .then() otrzymuje wartość z resolve, .catch() obsługuje błąd z reject, a .finally() wykonuje się zawsze, niezależnie od wyniku. Te metody również warto zapamiętać.
Łańcuchy Promise
Metoda .then() zwraca nowy Promise, co pozwala na sekwencyjne (łańcuchowe) wykonanie.
new Promise(resolve => resolve(10))
.then(num => num * 2)
.then(num => num + 5)
.then(result => console.log("Wynik:", result));
Tutaj początkowa wartość 10 jest mnożona przez 2, dodawane jest 5, a w rezultacie wyświetlane jest 25.
Promise.all, Promise.race i Promise.any
Metoda Promise.all() czeka na wykonanie wszystkich przekazanych obietnic.
Promise.all([
new Promise(resolve => setTimeout(() => resolve("Pierwsze"), 1000)),
new Promise(resolve => setTimeout(() => resolve("Drugie"), 2000))
]).then(results => console.log("Wszystkie wykonane:", results));
A Promise.race() zwraca pierwszą wykonaną obietnicę. Tę metodę łatwo zapamiętać po nazwie race - kto pierwszy, ten wygrywa.
Promise.race([
new Promise(resolve => setTimeout(() => resolve("Pierwsze"), 1000)),
new Promise(resolve => setTimeout(() => resolve("Drugie"), 500))
]).then(result => console.log("Pierwsze wykonane:", result));
Promise.any() — to metoda, która przyjmuje tablicę obietnic i zwraca pierwszą pomyślnie wykonaną obietnicę. Jeśli wszystkie obietnice zostaną odrzucone, zwraca błąd AggregateError.
const p1 = new Promise((_, reject) => setTimeout(() => reject("Błąd 1"), 1000));
const p2 = new Promise(resolve => setTimeout(() => resolve("Sukces 2"), 2000));
const p3 = new Promise(resolve => setTimeout(() => resolve("Sukces 3"), 3000));
Promise.any([p1, p2, p3])
.then(result => console.log("Pierwszy pomyślny wynik:", result))
.catch(error => console.log("Wszystkie obietnice odrzucone:", error));
Co się dzieje w przykładzie:
- p1 jest odrzucana po 1 sekundzie.
- p2 jest pomyślnie wykonywana po 2 sekundach.
- Promise.any() zwraca p2, ponieważ była pierwsza pomyślna.
- Jeśli wszystkie obietnice zostaną odrzucone, zwróci AggregateError, który będzie zawierał wszystkie błędy.
Ta metoda jest przydatna, gdy trzeba uzyskać pierwszy udany wynik, ignorując nieudane
Ten post nie ma jeszcze żadnych dodatków od autora.