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.
Porównanie w tabeli
#Co zwraca po sukcesie
- Promise.all()
- Tablicę wyników w kolejności obietnic
- Promise.allSettled()
- Tablicę obiektów
{ status, value }lub{ status, reason }
Kiedy się odrzuca
- Promise.all()
- Natychmiast przy pierwszym błędzie
- Promise.allSettled()
- Nigdy się nie odrzuca
Czeka na rozstrzygnięcie każdej obietnicy
- Promise.all()
- Nie, przerywa się na pierwszym błędzie
- Promise.allSettled()
- Tak, zawsze czeka na wszystkie
Dostęp do błędów pojedynczych obietnic
- Promise.all()
- Tylko pierwszy błąd, przez
catch() - Promise.allSettled()
- Każdy błąd, w polu
reasonjego wyniku
Pusta tablica jako argument
- Promise.all()
- Spełnia się od razu tablicą
[] - Promise.allSettled()
- Spełnia się od razu tablicą
[]
Typowe użycie
- Promise.all()
- Operacje, które muszą się wszystkie powiść
- Promise.allSettled()
- Niezależne operacje, gdzie błąd jednej nie przeszkadza resztę
Przykład
#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))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
#Promise.all(iterable)
Promise.allSettled(iterable)Więcej przykładów
#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)
}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)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 polestatuskaż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
#- Promise.all()Czeka na spełnienie wszystkich obietnic i zwraca tablicę ich wyników. Odrzuca się przy pierwszym błędzie.
- Promise.allSettled()Czeka na rozstrzygnięcie wszystkich obietnic i zwraca opis każdego wyniku, zarówno sukcesów, jak i błędów.
- Promise.race()Zwraca obietnicę, która rozstrzyga się tak samo jak pierwsza rozstrzygnięta obietnica z listy: sukcesem albo błędem.
- Promise.any()Zwraca wynik pierwszej spełnionej obietnicy. Odrzuca się dopiero wtedy, gdy zawiodą wszystkie.
Widzisz błąd albo brakuje przykładu? Napisz do nas.