Promise.prototype.then()

Rejestruje funkcję wywoływaną po spełnieniu obietnicy i zwraca nową obietnicę, co pozwala łączyć kroki w łańcuch.

Zwraca
Nową obietnicę, spełnioną wartością zwróconą przez funkcję albo odrzuconą, jeśli funkcja rzuci błąd.
Na tej stronie

Przykład

#
JavaScript
const wait = (ms, value) => new Promise((resolve) => setTimeout(() => resolve(value), ms))

wait(200, 120)
  .then((points) => points + 30)
  .then((points) => {
    console.log(`Masz ${points} punktów`)
    return wait(200, points >= 150)
  })
  .then((levelUp) => console.log('Nowy poziom:', levelUp))
Konsola
Masz 150 punktów
Nowy poziom: true

Definicja i zastosowanie

#

Metoda then() przyjmuje funkcję, która zostanie wywołana z wartością obietnicy, gdy ta się spełni. Opcjonalny drugi argument to funkcja obsługi błędu, ale zwykle zamiast niego używa się osobnego catch() na końcu łańcucha.

then() zawsze zwraca nową obietnicę. Jej wartością staje się to, co zwróci Twoja funkcja. Zwykła wartość trafia od razu do następnego then(), a zwrócona obietnica sprawia, że łańcuch poczeka na jej wynik. Dzięki temu kolejne kroki (pobierz, przetwórz, wyświetl) układają się jeden pod drugim zamiast zagnieżdżać.

Najczęstszy błąd to brak return w środku łańcucha. Następny krok dostaje wtedy undefined i nie czeka na zakończenie operacji asynchronicznej rozpoczętej w poprzednim kroku.

Składnia

#
Składnia
promise.then(onFulfilled)
promise.then(onFulfilled, onRejected)

Parametry

#
  • onFulfilled

    function (value)

    Funkcja wywoływana z wartością spełnionej obietnicy. To, co zwróci, stanie się wartością nowej obietnicy.
  • onRejected

    opcjonalna function (reason)

    Funkcja wywoływana, gdy obietnica zostanie odrzucona. Zwykle wygodniej użyć catch().

Więcej przykładów

#
Pułapka: zapomniany return
JavaScript
const wait = (ms, value) => new Promise((resolve) => setTimeout(() => resolve(value), ms))

wait(100, 'Lekcja 1')
  .then((lesson) => {
    wait(100, lesson + ' ukończona')
  })
  .then((result) => console.log(result))
Konsola
undefined

Funkcja w klamrach bez return zwraca undefined, więc następny then() nie czeka na wewnętrzną obietnicę. Wystarczy dopisać return albo usunąć klamry.

then() zawsze działa asynchronicznie
JavaScript
Promise.resolve('z obietnicy').then((value) => console.log(value))
console.log('synchronicznie')
Konsola
synchronicznie
z obietnicy

Obsługa przeglądarek

#

Szeroko dostępne

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • W każdym kroku łańcucha zwracaj wartość lub obietnicę. Funkcja strzałkowa bez klamer robi to automatycznie.
  • Jeden catch() na końcu łańcucha złapie błąd z dowolnego wcześniejszego kroku.
  • Przy wielu krokach rozważ async i await. Taki kod czyta się jak zwykły, wykonywany z góry na dół.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.