Adloun

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

Une seule fois

Portée, fermetures et this · niveau 3 (difficile)

Énoncé

Le bouton « Commander » ne doit envoyer la commande qu'une fois, même si le client clique plusieurs fois. Écrire une fonction d'ordre supérieur uneSeuleFois(fonction) qui renvoie une nouvelle fonction : au premier appel, elle appelle fonction avec les mêmes arguments et renvoie son résultat ; aux appels suivants, elle renvoie le même résultat sans rappeler fonction.

Corrigé


function uneSeuleFois(fonction) {
  let dejaAppelee = false;
  let resultat;
  return (...args) => {
    if (!dejaAppelee) {
      dejaAppelee = true;
      resultat = fonction(...args);
    }
    return resultat;
  };
}

const passerCommande = uneSeuleFois((total) => {
  console.log(`Commande de ${total} centimes envoyée`);
  return "CMD-001";
});

console.log(passerCommande(5900));
console.log(passerCommande(5900));
console.log(passerCommande(1200));

Commande de 5900 centimes envoyée
CMD-001
CMD-001
CMD-001

La fermeture mémorise deux variables : un booléen « déjà appelée » et le résultat. Le paramètre du reste ...args recueille les arguments, que fonction(...args) retransmet (cette écriture, la décomposition, est présentée au chapitre 5). La commande n'est envoyée qu'une fois ; les appels suivants renvoient le même numéro.

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 →