Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Struktura Promise (JavaScript) i jak z tym pracować

Okładka posta: Struktura Promise (JavaScript) i jak z tym pracować
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:
  1. p1 jest odrzucana po 1 sekundzie.
  2. p2 jest pomyślnie wykonywana po 2 sekundach.
  3. Promise.any() zwraca p2, ponieważ była pierwsza pomyślna.
  4. 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.

9 gru 14:50

[Fix] Nie ma takiego pliku ani katalogu @ rb_sysopen - tmp/pids/server.pid

meme code
meme code@memecode
Co należy wiedzieć, aby zbudować udaną karierę w IT jako freelancer
23 gru 16:03

Co należy wiedzieć, aby zbudować udaną karierę w IT jako freelancer

meme code
meme code@memecode
Wirtualny serwer chmurowy: czym jest i jaka jest jego specyfika
3 sty 10:58

Wirtualny serwer chmurowy: czym jest i jaka jest jego specyfika

meme code
meme code@memecode
[Fix] Heroku / SearchBox addon - błąd indeksowania "Klient nie może zweryfikować, że serwer to Elasticsearch"
31 sty 13:09

[Fix] Heroku / SearchBox addon - błąd indeksowania "Klient nie może zweryfikować, że serwer to Elasticsearch"

meme code
meme code@memecode
6 lut 15:31

Poprawka błędu [DEPRECATION] #adapters jest przestarzałe. Użyj zamiast tego #profiles. (Codecov / docile)

meme code
meme code@memecode
Czym jest Promise w JavaScript i jak szybko zrozumieć jego istotę?
18 lut 11:01

Czym jest Promise w JavaScript i jak szybko zrozumieć jego istotę?

meme code
meme code@memecode
Czym jest memoizacja (przykłady Ruby i Ruby on Rails)?
20 lut 18:16

Czym jest memoizacja (przykłady Ruby i Ruby on Rails)?

meme code
meme code@memecode
Czym jest debounce w JavaScript i dlaczego jest to ważne?
21 mar 16:39

Czym jest debounce w JavaScript i dlaczego jest to ważne?

meme code
meme code@memecode
Co to jest CFB (Cipher Feedback)?
21 mar 16:53

Co to jest CFB (Cipher Feedback)?

meme code
meme code@memecode
Co to jest XOR i jak to działa?
21 mar 17:05

Co to jest XOR i jak to działa?

meme code
meme code@memecode
Programowanie wbudowane: co to jest i od czego zacząć
24 mar 16:48

Programowanie wbudowane: co to jest i od czego zacząć

meme code
meme code@memecode
Pessimistic Lock w Rails: co to jest i kiedy stosować. Jakie są alternatywy?
31 mar 17:45

Pessimistic Lock w Rails: co to jest i kiedy stosować. Jakie są alternatywy?

meme code
meme code@memecode