PorównaniePorównania

Promise.all() vs Promise.allSettled()

Promise.all() odrzuca się przy pierwszym błędzie i zwraca tablicę wyników, a Promise.allSettled() czeka na każdą obietnicę i nigdy się nie odrzuca.

Na tej stronie

Porównanie w tabeli

#

Przykład

#
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(100, 'profil'), fail(150, 'Błąd kursów')])
} catch (error) {
  console.log('Promise.all:', error.message)
}

const settled = await Promise.allSettled([wait(100, 'profil'), fail(150, 'Błąd kursów')])
console.log('Promise.allSettled:', settled.map((r) => r.status))
Konsola
Promise.all: Błąd kursów
Promise.allSettled: ['fulfilled', 'rejected']

Definicja i zastosowanie

#

Obie metody przyjmują tablicę obietnic i pozwalają uruchomić niezależne operacje równolegle, a nie jedną po drugiej, więc razem trwają tyle, co najdłuższa z nich. Obie zwracają wyniki w kolejności przekazanych obietnic, niezależnie od tego, która rozstrzygnęła się pierwsza.

Różnią się zachowaniem przy błędzie. Promise.all() odrzuca się natychmiast, gdy odrzuci się choć jedna obietnica, a wyniki pozostałych przepadają (same operacje nie są przerywane, tylko ich wynik jest ignorowany). Promise.allSettled() nigdy się nie odrzuca: czeka na rozstrzygnięcie każdej obietnicy i zwraca tablicę obiektów { status, value } dla sukcesów oraz { status, reason } dla błędów.

Gdy każda operacja musi się powiść, a błąd jednej ma przerwać całość, użyj Promise.all(). Gdy operacje są od siebie niezależne i chcesz wiedzieć, które się udały, nawet jeśli inne zawiodły, użyj Promise.allSettled().

Składnia

#
Składnia
Promise.all(iterable)
Promise.allSettled(iterable)

Więcej przykładów

#
Kształt wyników allSettled() kontra błąd all()
JavaScript
const results = await Promise.allSettled([Promise.resolve('OK'), Promise.reject(new Error('Ups'))])
console.log(results)

try {
  await Promise.all([Promise.resolve('OK'), Promise.reject(new Error('Ups'))])
} catch (error) {
  console.log(error.message)
}
Konsola
[{ status: 'fulfilled', value: 'OK' }, { status: 'rejected', reason: Error: Ups }]
Ups
Tylko udane wyniki z allSettled()
JavaScript
const results = await Promise.allSettled([
  Promise.resolve('Ranking'),
  Promise.reject(new Error('Czat niedostępny')),
  Promise.resolve('Odznaki')
])

const succeeded = results.filter((r) => r.status === 'fulfilled').map((r) => r.value)
console.log(succeeded)
Konsola
['Ranking', 'Odznaki']

Dobre praktyki

#
  • Łącz obie metody z map(), żeby uruchomić tę samą operację dla wielu elementów naraz, np. await Promise.allSettled(ids.map(loadUser)).
  • Po Promise.allSettled() zawsze sprawdzaj pole status każdego wyniku. Sama metoda nie powie, że coś poszło nie tak.
  • Gdy liczy się tylko pierwszy wynik, sukces albo błąd, żadna z tych metod nie jest właściwa. Sprawdź Promise.race().

Powiązane hasła

#

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