Promise.all()

Czeka na spełnienie wszystkich obietnic i zwraca tablicę ich wyników. Odrzuca się przy pierwszym błędzie.

Zwraca
Obietnicę spełnioną tablicą wyników albo odrzuconą pierwszym błędem.
Na tej stronie

Przykład

#
JavaScript
const load = (name, ms) =>
  new Promise((resolve) => {
    setTimeout(() => {
      console.log(`Gotowe: ${name}`)
      resolve(name)
    }, ms)
  })

const results = await Promise.all([load('profil', 300), load('kursy', 100), load('odznaki', 200)])
console.log(results)
Konsola
Gotowe: kursy
Gotowe: odznaki
Gotowe: profil
['profil', 'kursy', 'odznaki']

Definicja i zastosowanie

#

Metoda Promise.all() przyjmuje tablicę (lub inny obiekt iterowalny) obietnic i zwraca jedną obietnicę. Ta spełnia się, gdy spełnią się wszystkie, a jej wartością jest tablica wyników w kolejności przekazanych obietnic, niezależnie od tego, która skończyła się pierwsza.

Dzięki temu niezależne operacje wykonują się równolegle, a nie jedna po drugiej. Trzy zapytania trwające po 300 ms zajmą razem około 300 ms, a nie 900 ms.

Jeśli którakolwiek obietnica zostanie odrzucona, Promise.all() od razu odrzuca się tym samym błędem, a wyniki pozostałych przepadają. Same operacje nie są przy tym przerywane. Gdy potrzebujesz wyników wszystkich operacji, także tych nieudanych, użyj Promise.allSettled().

Składnia

#
Składnia
Promise.all(iterable)

Parametry

#
  • iterable

    tablica obietnic

    Obietnice do połączenia. Zwykłe wartości (nie obietnice) trafiają do wyniku bez zmian.

Więcej przykładów

#
Jeden błąd odrzuca całość
JavaScript
const wait = (ms, value) => new Promise((resolve) => setTimeout(() => resolve(value), ms))
const fail = (ms, message) =>
  new Promise((_, reject) => setTimeout(() => reject(new Error(message)), ms))

try {
  await Promise.all([wait(300, 'profil'), fail(100, 'Nie udało się pobrać kursów')])
} catch (error) {
  console.log(error.message)
}
Konsola
Nie udało się pobrać kursów
Połączenie z map()
JavaScript
const wait = (ms, value) => new Promise((resolve) => setTimeout(() => resolve(value), ms))
const getPoints = (student) => wait(100, student.length * 10)

const students = ['Ania', 'Kuba', 'Ola']
const points = await Promise.all(students.map(getPoints))

console.log(points)
Konsola
[40, 40, 30]

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

#
  • Łącz Promise.all() z map(), żeby uruchomić tę samą operację dla wielu elementów naraz: await Promise.all(ids.map(loadUser)).
  • Nie używaj Promise.all() do operacji zależnych od siebie. Jeśli drugi krok potrzebuje wyniku pierwszego, wykonaj je po kolei.
  • Gdy porażka jednej operacji nie powinna przekreślać reszty, wybierz Promise.allSettled().

Powiązane hasła

#

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