Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →