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
- 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.