Adloun

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

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 →