Promise.any()

Zwraca wynik pierwszej spełnionej obietnicy. Odrzuca się dopiero wtedy, gdy zawiodą wszystkie.

Zwraca
Obietnicę spełnioną wartością pierwszej udanej obietnicy albo odrzuconą błędem AggregateError.
Na tej stronie

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))

const source = await Promise.any([
  fail(100, 'Serwer A nie działa'),
  wait(300, 'Serwer B'),
  wait(200, 'Serwer C')
])

console.log(`Dane z: ${source}`)
Konsola
Dane z: Serwer C

Definicja i zastosowanie

#

Metoda Promise.any() czeka na pierwszy sukces. Błędy pojedynczych obietnic są pomijane, dopóki choć jedna ma szansę się spełnić. To odróżnia ją od Promise.race(), w którym wygrywa także pierwszy błąd.

Jeśli odrzucone zostaną wszystkie obietnice, Promise.any() odrzuca się błędem AggregateError. Ma on pole errors z tablicą wszystkich powodów odrzucenia, ułożonych w kolejności przekazanych obietnic.

Typowe zastosowanie to pobieranie tego samego zasobu z kilku źródeł, na przykład z serwerów zapasowych, i użycie tego, które pierwsze odpowie poprawnie.

Składnia

#
Składnia
Promise.any(iterable)

Parametry

#
  • iterable

    tablica obietnic

    Obietnice, spośród których liczy się pierwszy sukces.

Więcej przykładów

#
Wszystkie obietnice odrzucone
JavaScript
try {
  await Promise.any([
    Promise.reject(new Error('Brak sieci')),
    Promise.reject(new Error('Serwer w konserwacji'))
  ])
} catch (error) {
  console.log(error.name)
  console.log(error.errors.map((e) => e.message))
}
Konsola
AggregateError
['Brak sieci', 'Serwer w konserwacji']
Porównanie z Promise.race()
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))

const tasks = () => [fail(100, 'Szybki błąd'), wait(200, 'Wolniejszy sukces')]

console.log(await Promise.any(tasks()))

try {
  await Promise.race(tasks())
} catch (error) {
  console.log(error.message)
}
Konsola
Wolniejszy sukces
Szybki błąd

Obsługa przeglądarek

#

Szeroko dostępne · od 2020 roku

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Obsługując błąd z Promise.any(), zajrzyj do error.errors. Znajdziesz tam przyczyny wszystkich porażek.
  • Gdy liczy się pierwszy wynik bez względu na to, czy to sukces, czy błąd, użyj Promise.race().

Powiązane hasła

#

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