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.
Przykład
#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)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
#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
#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)
}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)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()zmap(), ż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
#- 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.
- awaitWstrzymuje funkcję async do czasu rozstrzygnięcia obietnicy i zwraca jej wartość albo rzuca jej błąd.
- Array.prototype.map()Tworzy nową tablicę z wynikami wywołania funkcji dla każdego elementu.
Widzisz błąd albo brakuje przykładu? Napisz do nas.