Avez-vous une question? (216) 97 656 803 hajjriadh@gmail.com
JavaScript

18.1 Code synchrone et asynchrone

Code synchrone et asynchrone. Dans cette leçon du cours JavaScript, vous apprendrez à : • distinguer un code synchrone d'un code asynchrone ; • comprendre pourquoi une attente bloquante fige une page ...

0 chapitres 0 QCM Accès gratuit
Dans cet article

À propos de ce cours

Code synchrone et asynchrone. Dans cette leçon du cours JavaScript, vous apprendrez à : • distinguer un code synchrone d'un code asynchrone ; • comprendre pourquoi une attente bloquante fige une page web ; • prévoir l'ordre d'affichage d'un programme qui utilise setTimeout ; • reconnaître les situations qui demandent de l'asynchrone (réseau, minuteries, fichiers, événements).

Chapitre 18 — La programmation asynchrone · Leçon 1 : Code synchrone et asynchrone

🎯 Objectifs de la leçon
• distinguer un code synchrone d'un code asynchrone ;
• comprendre pourquoi une attente bloquante fige une page web ;
• prévoir l'ordre d'affichage d'un programme qui utilise setTimeout;
• reconnaître les situations qui demandent de l'asynchrone (réseau, minuteries, fichiers, événements).

1. Le code synchrone : une instruction après l'autre

Par défaut, JavaScript exécute les instructions dans l'ordre, de haut en bas. Une instruction ne commence que lorsque la précédente est terminée. C'est le comportement synchrone.

console.log("1. Début du programme");

function calculerSomme(n) {
  let total = 0;
  for (let i = 1; i <= n; i++) {
    total += i;
  }
  return total;
}

console.log("2. Somme de 1 à 100 :", calculerSomme(100));
console.log("3. Fin du programme");

Résultat dans la console

1. Début du programme
2. Somme de 1 à 100 : 5050
3. Fin du programme

Ici tout est rapide : le calcul de la somme prend quelques microsecondes, l'ordre d'affichage suit l'ordre du code.

2. Le problème : les opérations lentes

Certaines opérations prennent du temps, parfois plusieurs secondes : demander des données à un serveur, lire un gros fichier, attendre un clic de l'utilisateur, attendre une durée…

Or JavaScript n'a qu'un seul fil d'exécution (single thread) : il ne fait qu'une chose à la fois. Si l'on attendait de façon synchrone, tout serait bloqué pendant l'attente. Simulons-le :

// ⚠️ À NE JAMAIS FAIRE dans une vraie application : simulation d'une attente bloquante
function attendreBloquant(ms) {
  const fin = Date.now() + ms;
  while (Date.now() < fin) {
    // on tourne en rond : rien d'autre ne peut s'exécuter
  }
}

console.log("Avant l'attente");
attendreBloquant(2000); // la page est figée pendant 2 secondes
console.log("Après 2 secondes");

Résultat dans la console

Avant l'attente
Après 2 secondes
⚠️ Attention
Pendant ces 2 secondes, dans un navigateur, la page est gelée: les boutons ne répondent plus, les animations s'arrêtent, on ne peut même pas faire défiler la page. Au-delà de quelques secondes, le navigateur propose d'arrêter le script. Une attente bloquante n'est donc jamais une solution.

3. Le code asynchrone : lancer, continuer, revenir plus tard

Un code asynchrone lance une opération longue, n'attend pas son résultat et continue avec la suite du programme. Quand le résultat est prêt, une fonction prévue à l'avance (un callback) est exécutée.

La fonction setTimeout(fonction, délai) est le plus simple des outils asynchrones : elle demande d'exécuter une fonction plus tard, après un délai en millisecondes.

console.log("1. Je commande un café");

setTimeout(() => {
  console.log("3. Le café est prêt !");
}, 2000);

console.log("2. Je lis mes messages en attendant");

Résultat dans la console

1. Je commande un café
2. Je lis mes messages en attendant
3. Le café est prêt !

Le message 3 s'affiche en dernier alors qu'il est écrit avant le message 2 : pendant les 2 secondes d'attente, le programme a continué.

Comparaison entre exécution synchrone et asynchrone sur une ligne de temps
Figure 1 — En synchrone, l'attente bloque tout ; en asynchrone, le travail continue pendant l'attente.

4. Même avec un délai de 0 ms

Un délai de 0 ne veut pas dire « tout de suite » : la fonction passe après tout le code en cours.

console.log("A");
setTimeout(() => console.log("B (timer de 0 ms)"), 0);
console.log("C");

Résultat dans la console

A
C
B (timer de 0 ms)

Nous expliquerons pourquoi à la leçon suivante, avec la boucle d'événements.

5. Où rencontre-t-on de l'asynchrone ?

SituationOutil JavaScriptExemple
Attendre une duréesetTimeout, setIntervalAfficher une notification pendant 3 s
Communiquer avec un serveurfetchCharger la météo, envoyer un formulaire
Réagir à l'utilisateuraddEventListenerExécuter du code au clic sur un bouton
Lire ou écrire des fichiers (Node.js)fs.promisesLire un fichier de configuration
Bases de données, caméra, géolocalisation…API du navigateurnavigator.geolocation
ℹ️ À retenir
• Synchrone : chaque instruction attend la fin de la précédente.
• JavaScript n'a qu'un seul fil d'exécution : une attente bloquante fige toute la page.
• Asynchrone : on lance l'opération, on continue, et une fonction est rappelée quand le résultat arrive.
• setTimeout(f, 0) exécute f après tout le code en cours, jamais immédiatement.

🛠 Activité 1 — Prévoir l'ordre d'exécution

Mission : Sans exécuter le code, prévoyez ce qu'il affiche, puis vérifiez dans la console (F12) ou avec node.

Questions pour avancer (répondez dans votre compte rendu, puis appliquez dans votre projet) :

  1. Quel est l'ordre d'affichage de ce programme ? Justifiez chaque position.
    console.log("1");
    setTimeout(() => console.log("2"), 1000);
    setTimeout(() => console.log("3"), 0);
    console.log("4");
    setTimeout(() => console.log("5"), 500);
  2. Combien de temps faut-il, environ, pour que tout soit affiché ? Est-ce 1 000 ms, 1 500 ms ou autre chose ? Pourquoi ?
  3. Remplacez setTimeout par la fonction attendreBloquant de la partie 2 : l'ordre change-t-il ? Et la durée totale ?
  4. Créez une page HTML avec un bouton qui affiche une alerte et un second bouton qui lance attendreBloquant(5000). Cliquez sur le second, puis tout de suite sur le premier. Que se passe-t-il ? Décrivez-le avec le mot « bloquant ».
  5. Donnez deux exemples d'applications que vous utilisez (réseau social, banque, jeu…) et, pour chacune, une opération qui doit forcément être asynchrone.
  6. Pourquoi les concepteurs de JavaScript n'ont-ils pas simplement ajouté une fonction sleep(ms) bloquante comme dans d'autres langages ?

Je vérifie / je rends :

  • ☐ Vos prédictions et le résultat réel, avec l'explication des différences.
  • ☐ La page HTML de la question 4.

18.2 — La boucle d'événements (event loop) →