JavaScript : rendre le Web interactif (école d'ingénieur) · Chapitre 10 · Application directe du cours
Ne pas demander deux fois
Dialoguer avec un serveur : fetch · niveau 3 (difficile)
Énoncé
Plusieurs parties d'une page demandent la fiche du même livre, parfois au même instant. Écrire chargerLivre(isbn) qui n'envoie qu'une requête par ISBN, même quand deux appels arrivent avant la réponse du premier, et qui n'enregistre pas les échecs (un livre introuvable doit être redemandé au prochain appel). Indication : mettre en cache la promesse, pas la valeur.
Corrigé
const cache = new Map(); // isbn → promesse
function chargerLivre(isbn) {
if (!cache.has(isbn)) {
const promesse = obtenirJson(`http://localhost:8000/api/livres/${isbn}`);
promesse.catch(() => cache.delete(isbn)); // un échec n'est pas mis en cache
cache.set(isbn, promesse);
}
return cache.get(isbn);
}
La promesse est enregistrée dès l'envoi : un second appel, même immédiat, reçoit la même promesse au lieu d'envoyer une seconde requête. Si l'on mettait en cache la valeur, il faudrait attendre la réponse pour la connaître, et deux appels simultanés enverraient deux requêtes. En comptant les requêtes (exercices/ex9-cache.mjs) : deux appels simultanés puis un troisième pour le même livre donnent une seule requête, et les trois appels obtiennent le même objet ; un ISBN inexistant demandé deux fois donne deux requêtes, et seul le livre trouvé reste en cache.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 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.