Przejdź do głównej treści
eLearner.app
Moduł 7 · Lekcja 4 z 428/32 w kursie~12 min
Lekcje modułu (4/4)

Błędy w kodzie asynchronicznym

Operacje asynchroniczne kończą się niepowodzeniem w inny sposób niż operacje synchroniczne: błąd nie pojawia się natychmiast, lecz „później”, gdy obiekt Promise przechodzi w stan rejected. Zobaczmy dwa główne narzędzia do ich obsługi.

try/catch z await

Gdy używasz słowa kluczowego await przed obietnicą, która kończy się błędem, błąd ten zostanie rzucony ponownie jako standardowy wyjątek: możesz go przechwycić za pomocą bloku try/catch.

JS
async function leggiSicuro() {
  try {
    const r = await fetch('/api/cose');
    if (!r.ok) throw new Error('HTTP ' + r.status);
    return await r.json();
  } catch (err) {
    console.error('errore di rete:', err.message);
    return null;
  }
}

Jest to najbardziej czytelny wzorzec: piszesz liniowy kod dla optymistycznego scenariusza („happy path”), a wszystkie błędy obsługujesz w jednym wspólnym bloku.

.catch na obiekcie Promise

W stylu łańcuchowym:

JS
fetch('/api/cose')
  .then((r) => r.json())
  .then((dati) => console.log(dati))
  .catch((err) => console.error(err));

.catch przechwytuje dowolny błąd rzucony wzdłuż poprzedzającego łańcucha.

Promise.all kończy się niepowodzeniem przy pierwszym odrzuceniu (rejection)

JS
const ps = [Promise.resolve(1), Promise.reject(new Error('no')), Promise.resolve(3)];
try {
  const r = await Promise.all(ps);
} catch (err) {
  console.log(err.message); // 'no'
}

Pozostałe obietnice nadal działają w tle, ale Promise.all rozstrzyga się natychmiast po wystąpieniu pierwszego błędu. Jeśli chcesz uzyskać wyniki wszystkich obietnic (w tym informacji o błędach), użyj Promise.allSettled:

JS
const esiti = await Promise.allSettled(ps);
// [{ status: 'fulfilled', value: 1 },
//  { status: 'rejected', reason: Error('no') },
//  { status: 'fulfilled', value: 3 }]

Spróbuj sam

Ćwiczenie#js.m7.l4.e1
Próby: 0Ładowanie...

Zdefiniuj funkcję asynchroniczną `readOrFallback(p, fallback)`: próbuje oczekiwać (await) na Promise p; jeśli zostanie odrzucone (rejected), zwraca fallback.

Ładowanie edytora...
Pokaż wskazówkę

try { return await p; } catch { return fallback; }

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#js.m7.l4.e2
Próby: 0Ładowanie...

Zdefiniuj funkcję asynchroniczną `allOrNothing(promises)`: używa Promise.all. Jeśli przynajmniej jedna obietnica zawiedzie, zwraca pustą tablicę []. W przeciwnym razie zwraca wartości.

Ładowanie edytora...
Pokaż wskazówkę

try { return await Promise.all(promises); } catch { return []; }

Rozwiązanie dostępne po 3 próbach