Chapitre 15 – Asynchronisme en JavaScript

L'asynchronisme permet à JavaScript de gérer des opérations longues (comme des appels réseau ou des minuteries) sans bloquer l'exécution du reste du programme. C'est une fonctionnalité essentielle pour développer des interfaces interactives et réactives.

Zone de démonstration interactive

Les résultats apparaîtront ici...

1. Les fonctions asynchrones en JavaScript

Par défaut, JavaScript est synchrone : les instructions sont exécutées ligne par ligne. Mais certaines tâches prennent du temps (ex. : accéder à un serveur). Pour éviter de bloquer l'exécution, on utilise des techniques asynchrones.

Exemple synchrone

console.log("Début");
console.log("Fin");

Exemple asynchrone avec setTimeout

console.log("Début");

setTimeout(() => {
  console.log("Tâche longue terminée");
}, 2000);

console.log("Fin");

La tâche longue (le setTimeout) est reportée, laissant les autres instructions s'exécuter immédiatement.

2. Les promesses (Promise)

Une Promise représente une valeur potentielle qui sera disponible dans le futur. Elle peut être dans trois états :

Créer une promesse

const promesse = new Promise((resolve, reject) => {
  const succès = true;

  if (succès) {
    resolve("Tout s'est bien passé !");
  } else {
    reject("Une erreur est survenue.");
  }
});

3. then, catch, finally

Une fois qu'une promesse est créée, on peut utiliser :

promesse
  .then((résultat) => {
    console.log(résultat);
  })
  .catch((erreur) => {
    console.error(erreur);
  })
  .finally(() => {
    console.log("Fin de l'opération asynchrone.");
  });

4. async / await

Pour écrire du code asynchrone de manière plus lisible, on utilise les mots-clés async et await.

function obtenirUtilisateur() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve("Utilisateur récupéré");
    }, 1000);
  });
}

async function afficherUtilisateur() {
  console.log("Chargement...");
  const utilisateur = await obtenirUtilisateur();
  console.log(utilisateur);
}

afficherUtilisateur();

Le code semble synchrone mais utilise l'asynchronisme en arrière-plan.

5. Gestion des erreurs asynchrones

Avec async/await, on peut utiliser try...catch pour capturer les erreurs :

async function obtenirDonnées() {
  try {
    const réponse = await fetch("https://exemple.com/api");
    const données = await réponse.json();
    console.log(données);
  } catch (erreur) {
    console.error("Erreur lors de la requête :", erreur);
  }
}

Ce modèle est largement utilisé dans les applications modernes, notamment avec fetch, axios, ou les APIs web.

6. API Fetch en détail

L'API Fetch permet de faire des requêtes HTTP asynchrones. Elle retourne une promesse qui se résout avec la réponse du serveur.

async function chargerDonnées() {
  try {
    const response = await fetch('https://api.exemple.com/data');
    
    if (!response.ok) {
      throw new Error(`Erreur HTTP: ${response.status}`);
    }
    
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error("Erreur de chargement:", error);
  }
}

Résumé du chapitre

  • JavaScript est capable de gérer l'asynchronisme via des fonctions comme setTimeout, les événements, ou les appels réseau.
  • Les promesses (Promise) permettent de représenter une opération future. Elles se manipulent avec then, catch et finally.
  • Le mot-clé async permet de déclarer une fonction asynchrone, et await permet de suspendre temporairement l'exécution jusqu'à ce que la promesse soit résolue.
  • Pour gérer les erreurs dans une fonction asynchrone, on utilise try...catch, comme dans les fonctions classiques.
  • L'API fetch est la méthode moderne pour effectuer des requêtes HTTP asynchrones en JavaScript.

Maîtriser l'asynchronisme est indispensable pour développer des interfaces utilisateurs modernes, interactives et performantes.