Leçons du module (4/4)
Erreurs dans le code asynchrone
Les opérations asynchrones échouent différemment des opérations synchrones : l'erreur n'arrive pas immédiatement, elle arrive « après », lorsque la Promise passe à l'état rejected. Voyons les deux outils principaux.
try/catch avec await
Lorsque vous placez await devant une Promise qui échoue, l'erreur est re-levée comme une
exception normale : vous la capturez avec try/catch.
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;
}
}C'est le pattern le plus lisible : vous écrivez le chemin nominal (« happy path ») de manière linéaire, et gérez tout dans un seul bloc.
.catch sur une Promise
En style chaîne :
fetch('/api/cose')
.then((r) => r.json())
.then((dati) => console.log(dati))
.catch((err) => console.error(err));.catch capture n'importe quelle erreur levée le long de la chaîne précédente.
Promise.all échoue au premier rejet (rejection)
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'
}Les autres Promise continuent de s'exécuter en arrière-plan, mais Promise.all se résout dès la première erreur.
Si vous souhaitez obtenir les résultats de toutes les Promises (y compris les échecs), utilisez Promise.allSettled :
const esiti = await Promise.allSettled(ps);
// [{ status: 'fulfilled', value: 1 },
// { status: 'rejected', reason: Error('no') },
// { status: 'fulfilled', value: 3 }]À vous de jouer
Définissez `readOrFallback(p, fallback)` en mode async : tentez d'attendre la Promise p ; si elle est rejetée (rejected), retournez la valeur fallback.
Afficher l'indice
try { return await p; } catch { return fallback; }
Solution disponible après 3 tentatives
Exercice de révision
Définissez `allOrNothing(promises)` en mode async : utilisez Promise.all. Si au moins une échoue, retournez le tableau vide []. Sinon, retournez les valeurs.
Afficher l'indice
try { return await Promise.all(promises); } catch { return []; }
Solution disponible après 3 tentatives