Promise.prototype.finally()

Rejestruje funkcję wywoływaną po rozstrzygnięciu obietnicy, bez względu na to, czy skończyła się sukcesem, czy błędem.

Zwraca
Nową obietnicę z tym samym wynikiem lub błędem co oryginał.
Na tej stronie

Przykład

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

let loading = true
console.log('Ładowanie:', loading)

wait(300, ['Lekcja 1', 'Lekcja 2'])
  .then((lessons) => console.log('Lekcje:', lessons))
  .catch((error) => console.log('Błąd:', error.message))
  .finally(() => {
    loading = false
    console.log('Ładowanie:', loading)
  })
Konsola
Ładowanie: true
Lekcje: ['Lekcja 1', 'Lekcja 2']
Ładowanie: false

Definicja i zastosowanie

#

Metoda finally() przyjmuje funkcję bez argumentów, która uruchomi się zawsze, gdy obietnica przestanie oczekiwać: po spełnieniu i po odrzuceniu. To dobre miejsce na sprzątanie, na przykład ukrycie wskaźnika ładowania albo odblokowanie przycisku.

Funkcja w finally() nie dostaje wyniku ani błędu i nie zmienia wartości łańcucha. Wynik lub błąd przechodzi przez nią dalej bez zmian, więc kolejne then() i catch() działają tak, jakby jej nie było.

Jest jeden wyjątek: jeśli funkcja w finally() rzuci błąd albo zwróci odrzuconą obietnicę, ten nowy błąd zastąpi oryginalny wynik.

Składnia

#
Składnia
promise.finally(onFinally)

Parametry

#
  • onFinally

    function ()

    Funkcja wywoływana po spełnieniu lub odrzuceniu obietnicy. Nie dostaje żadnych argumentów.

Więcej przykładów

#
Wynik i błąd przechodzą przez finally()
JavaScript
const value = await Promise.resolve(42).finally(() => 'ta wartość jest ignorowana')
console.log(value)

try {
  await Promise.reject(new Error('Serwer nie odpowiada')).finally(() => {
    console.log('Sprzątanie po błędzie')
  })
} catch (error) {
  console.log(error.message)
}
Konsola
42
Sprzątanie po błędzie
Serwer nie odpowiada

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

#
  • Używaj finally() do sprzątania, które musi się wykonać zawsze: wyłączenia wskaźnika ładowania, zamknięcia połączenia, odblokowania formularza.
  • Nie zwracaj z finally() wartości, na które liczysz. Zostaną zignorowane.
  • W kodzie z await odpowiednikiem jest blok finally w konstrukcji try...catch...finally.

Powiązane hasła

#

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