Adloun

JavaScript : rendre le Web interactif (école d'ingénieur) · Chapitre 9 · Application directe du cours

Un délai maximal

Programmation asynchrone · niveau 3 (difficile)

Énoncé

Écrire avecDelaiMax(promesse, ms), qui renvoie une promesse réglée comme promesse si celle-ci se règle en moins de ms millisecondes, et rompue avec l'erreur « délai de ms ms dépassé » sinon. Penser à annuler le minuteur quand il ne sert plus.

Corrigé

On fait courir la promesse contre une promesse d'expiration :


function avecDelaiMax(promesse, ms) {
  let minuteur;
  const expiration = new Promise((_, rejeter) => {
    minuteur = setTimeout(() => rejeter(new Error(`délai de ${ms} ms dépassé`)), ms);
  });
  return Promise.race([promesse, expiration]).finally(() => clearTimeout(minuteur));
}

console.log(await avecDelaiMax(attendre(100, "à temps"), 500));
try {
  await avecDelaiMax(attendre(1000, "trop tard"), 500);
} catch (e) {
  console.log("erreur :", e.message);
}

à temps
erreur : délai de 500 ms dépassé

Sans le clearTimeout, le premier appel laisserait un minuteur inutile courir 500 ms (et, dans Node, retarderait d'autant la fin du programme). L'opération lente, elle, n'est pas arrêtée : la course ne fait que cesser de l'attendre. Pour arrêter vraiment une requête réseau, on utilisera un AbortController (chapitre 10).

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 →