JavaScript : rendre le Web interactif (école d'ingénieur) · Chapitre 9 · Exercice de TD
Réessayer
Programmation asynchrone · niveau 3 (difficile)
Énoncé
Un serveur surchargé répond parfois par une erreur passagère. Écrire async function reessayer(operation, essais = 3, pause = 100), qui appelle operation() (une fonction renvoyant une promesse) ; en cas d'échec, elle attend pause ms, double la pause, et recommence, au plus essais fois en tout. Après le dernier échec, elle lève la dernière erreur.
Corrigé
async function reessayer(operation, essais = 3, pause = 100) {
for (let i = 1; ; i++) {
try {
return await operation();
} catch (e) {
if (i === essais) throw e;
console.log(`essai ${i} raté (${e.message}), nouvel essai dans ${pause} ms`);
await attendre(pause);
pause *= 2;
}
}
}
Le return await est indispensable : un simple return operation() renverrait la promesse sans l'attendre, et son échec échapperait au try. Avec un serveur qui échoue aux deux premiers appels (exercices/ex9-reessayer.mjs) :
essai 1 raté (erreur 503), nouvel essai dans 100 ms
essai 2 raté (erreur 503), nouvel essai dans 200 ms
catalogue reçu
Doubler la pause (recul exponentiel) évite d'accabler un serveur déjà surchargé.
100 % gratuit
La suite du chapitre est sur Adloun
- 11 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.