Salt la conținutul principal
Modulul 7 · Lecția 4 din 428/32 în curs~12 min
Lecții din modul (4/4)

Erori în codul asincron

Operațiile asincrone eșuează diferit de cele sincrone: eroarea nu vine imediat, ajunge „mai târziu”, când Promisiunea intră în starea respins. Să ne uităm la cele două instrumente principale.

try/catch cu await

Când puneți await înaintea unei promisiuni care eșuează, eroarea este rearunsă ca excepție normală: îl prinzi cu try/catch.

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

Este modelul cel mai ușor de citit: scrieți liniar „calea fericită” și gestionați totul într-un singur bloc.

.catch pe o promisiune

În stil înlănțuit:

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

.catch prinde orice eroare aruncată de-a lungul lanțului precedent.

Promise.all nu reușește la prima respingere

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'
}

Celelalte Promise continuă să ruleze în fundal, dar Promise.all „se stabilește” cu prima eroare. Dacă doriți rezultatele tuturor (inclusiv eșecurile), utilizați Promise.allSettled:

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

Încearcă

Exercițiu#js.m7.l4.e1
Încercări: 0Se încarcă…

Definiți `readOrFallback(p, fallback)` asincron: încercați să așteptați Promise p; dacă este respins, returnați fallback.

Se încarcă editorul...
Afișează indiciu

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

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#js.m7.l4.e2
Încercări: 0Se încarcă…

Definiți `allOrNothing(promises)` asincron: utilizați Promise.all. Dacă cel puțin unul eșuează, returnați matricea goală []. În caz contrar, returnează valorile.

Se încarcă editorul...
Afișează indiciu

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

Soluție disponibilă după 3 încercări