React Academy · Leçon

Conditions de concurrence et nettoyage des effets

Utilisez AbortController dans useEffect pour annuler les requêtes fetch obsolètes lors d’un nouveau rendu.

Leçon 1 sur 413 étapes

Conditions de concurrence et nettoyage des effets est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage React Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours React Academy comprend 4 leçons au total.

Bienvenue

Dans cette leçon, vous apprendrez comment apparaissent les conditions de concurrence dans les effets React qui récupèrent des données, et comment les éliminer à l'aide d'AbortController pour le nettoyage.

Qu'est-ce qu'une condition de concurrence ?

Une condition de concurrence apparaît lorsque deux opérations asynchrones se terminent dans un ordre imprévisible. Dans React, si un utilisateur navigue rapidement entre plusieurs éléments, une récupération lente pour l'élément A peut se terminer après celle de l'élément B et afficher des données obsolètes.

Le bogue : réponse de récupération obsolète

Sans nettoyage, si le composant est rendu de nouveau avec un nouvel ID avant la fin de l'ancienne récupération, les deux récupérations s'exécutent. La récupération plus ancienne et plus lente peut écraser les données plus récentes de l'état.
useEffect(() => {
  fetch('/api/item/' + id)
    .then(r => r.json())
    .then(data => setData(data)); // may run AFTER a newer fetch!
}, [id]);

Correctif 1 : indicateur d'ignorance

Une solution simple consiste à définir un indicateur booléen `ignore` dans l'effet. La fonction de nettoyage le définit sur true. La fonction de rappel de la récupération vérifie l'indicateur avant d'appeler setState.
useEffect(() => {
  let ignore = false;
  fetch('/api/item/' + id)
    .then(r => r.json())
    .then(data => { if (!ignore) setData(data); });
  return () => { ignore = true; };
}, [id]);

Correctif 2 : AbortController

AbortController est la norme moderne. Créez un controller dans l'effet, transmettez son signal à fetch et appelez abort dans la fonction de nettoyage. La récupération lève une AbortError que vous pouvez ignorer.
useEffect(() => {
  const controller = new AbortController();
  fetch('/api/item/' + id, { signal: controller.signal })
    .then(r => r.json())
    .then(data => setData(data))
    .catch(err => {
      if (err.name === 'AbortError') return; // expected
      setError(err.message);
    });
  return () => controller.abort();
}, [id]);

AbortController avec async/await

Utilisez try/catch avec des fonctions asynchrones à l'intérieur de useEffect. Ignorez AbortError dans le bloc catch.
useEffect(() => {
  const ctrl = new AbortController();
  async function load() {
    try {
      const res = await fetch('/api/' + id, { signal: ctrl.signal });
      const json = await res.json();
      setData(json);
    } catch (e) {
      if (e.name !== 'AbortError') setError(e.message);
    }
  }
  load();
  return () => ctrl.abort();
}, [id]);

Le nettoyage est toujours nécessaire

Même lorsque les conditions de concurrence sont peu probables, par exemple pour une récupération unique au montage, ajoutez toujours un nettoyage. Dans React 18 StrictMode, les effets sont exécutés deux fois ; sans nettoyage, la première requête abandonnée pollue l'état.

Le piège du caractère asynchrone de useEffect

La fonction de rappel de useEffect ne peut pas être `async`. Définissez une fonction asynchrone à l'intérieur de l'effet et appelez-la immédiatement, ou utilisez une fonction ordinaire avec .then()/.catch().
useEffect(() => {
  // useEffect callback is NOT async
  async function fetchData() { /* ... */ }
  fetchData(); // call it
  return () => ctrl.abort();
}, [id]);

Les bibliothèques s'en chargent pour vous

React Query, SWR et RTK Query gèrent automatiquement les conditions de concurrence, l'abandon et le nettoyage. Lorsque vous utilisez ces bibliothèques, vous n'avez pas besoin d'écrire manuellement du code avec AbortController.

Tester les conditions de concurrence

Pour tester manuellement les conditions de concurrence : ouvrez les DevTools réseau, activez la limitation « 3G lent » et cliquez rapidement entre plusieurs éléments. Sans nettoyage, vous verrez brièvement des données obsolètes. Avec AbortController, seul le dernier élément sélectionné s'affiche.

Vérification rapide

Que fait l'appel à controller.abort() dans une fonction de nettoyage de useEffect ?

Récapitulatif

Les conditions de concurrence apparaissent lorsqu'une réponse de récupération obsolète met à jour l'état après une récupération plus récente. Corrigez-les avec un indicateur d'ignorance ou AbortController. Abandonnez ou ignorez toujours la récupération lors du nettoyage de useEffect. Des bibliothèques comme React Query s'en chargent automatiquement.

À suivre

Prochaine leçon : **useTransition pour des mises à jour d'interface non bloquantes** — vous envelopperez les mises à jour d'état coûteuses dans startTransition afin de garder l'interface réactive.
Gratuit pour commencer

Apprends React avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
88
Leçons
324

Questions Fréquemment Posées

La leçon « Conditions de concurrence et nettoyage des effets » est-elle gratuite ?

Oui — le texte complet de « Conditions de concurrence et nettoyage des effets » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours React Academy, passe à CoddyKit PRO. Le cours React Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Conditions de concurrence et nettoyage des effets » ?

Utilisez AbortController dans useEffect pour annuler les requêtes fetch obsolètes lors d’un nouveau rendu. Tu pratiques React Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer React Academy ?

Aucune expérience préalable n'est requise. React Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Conditions de concurrence et nettoyage des effets » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon React Academy ?

Oui. Chaque leçon React Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Conditions de concurrence et nettoyage des effets
  2. useTransition pour des mises à jour d’interface non bloquantes
  3. useDeferredValue pour temporiser les saisies
  4. Suspense pour les frontières de données et de code
← Retour à React Academy