Saltar al contenido principal
eLearner.app
Módulo 7 · Lección 4 de 428/32 en el curso~12 min
Lecciones del módulo (4/4)

Errores en código asíncrono

Las operaciones asíncronas fallan de manera diferente a las síncronas: el error no llega de inmediato, llega "después", cuando la Promise entra en estado rejected. Veamos las dos herramientas principales.

try/catch con await

Cuando pones await delante de una Promise que falla, el error se lanza de nuevo como una excepción normal: lo capturas con 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;
  }
}

Es el patrón más legible: escribes el "happy path" lineal y gestionas todo en un único bloque.

.catch en una Promise

En estilo cadena:

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

.catch captura cualquier error lanzado a lo largo de la cadena anterior.

Promise.all falla ante la primera 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'
}

Las otras Promise continúan ejecutándose en segundo plano, pero Promise.all se "decide" en el primer error. Si quieres los resultados de todas (incluidos los fallos), usa Promise.allSettled:

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

Pruébalo tú

Ejercicio#js.m7.l4.e1
Intentos: 0Cargando...

Define `readOrFallback(p, fallback)` async: intenta hacer await de la Promise p; si es rejected devuelve fallback.

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos

Ejercicio de repaso

Ejercicio#js.m7.l4.e2
Intentos: 0Cargando...

Define `allOrNothing(promises)` async: usa Promise.all. Si al menos una falla, devuelve el array vacío []. De lo contrario, devuelve los valores.

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos