Dormir comme un Jedi : guide complet de sleep() en JavaScript 2025

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi JavaScript n'a-t-il pas de sleep() normal ?

\n

Bonjour, collègues développeurs ! Si vous êtes déjà passé à JavaScript depuis Python, PHP ou Java, vous vous êtes sûrement demandé : « Mais où est donc mon cher sleep(1) pour que le programme dorme une seconde ? ». Et, après avoir fouillé la documentation, vous avez découvert avec surprise qu'une telle fonction n'existe pas en JavaScript pur.

\n

Ce n'est pas un bug, c'est une fonctionnalité. JavaScript est un langage monothread fonctionnant avec une boucle d'événements (Event Loop). Si nous bloquions simplement le thread pendant une seconde, toute l'interface se figerait, les clics, les animations et les requêtes cesseraient d'être traités. Un sleep() bloquant est un anti-patron pour le web.

\n

Mais cela ne signifie pas que nous ne pouvons pas faire une pause. La question « What is the JavaScript version of sleep()? » sur Stack Overflow a recueilli des centaines de milliers de vues, et en 2025, nous avons tout un arsenal de solutions, des plus simples aux plus sophistiquées.

\n

Dans cet article (spécialement pour le portail éducatif pythonlib.ru), nous analyserons toutes les façons légales d'endormir JavaScript, leurs avantages et inconvénients, et nous déterminerons les meilleures pratiques pour différentes situations.

\n\n

La méthode la plus correcte : async/await et les promesses

\n

Depuis ES2017, JavaScript dispose d'une asynchronie améliorée — async/await. Si vous souhaitez faire une pause sans bloquer le thread principal, vous avez besoin d'une fonction qui retourne une Promise, qui se résoudra après le temps souhaité.

\n

La voici, notre sleep() personnalisée pour 2025 :

\n\n
// Fonction de délai universelle\nfunction sleep(ms) {\n    return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// Utilisation\nasync function demo() {\n    console.log('On commence...');\n    await sleep(2000); // On attend 2 secondes\n    console.log('2 secondes se sont écoulées !');\n}\n\ndemo();\n
\n\n

C'est un sleep non bloquant. Pendant l'exécution de await sleep(2000), le reste du code (gestionnaires d'événements, autres fonctions asynchrones) continue de fonctionner. L'Event Loop ne s'endort pas — il retarde simplement l'exécution des lignes suivantes jusqu'à la résolution de la promesse.

\n\n

Pourquoi est-ce la meilleure pratique ?

\n
    \n
  • Ne bloque pas l'UI — l'interface reste réactive.
  • \n
  • Syntaxe standard — se lit comme du code synchrone ordinaire.
  • \n
  • Convient à Node.js — le serveur ne se fige pas.
  • \n
  • Supporté partout — navigateurs modernes et Node.js 8+.
  • \n
\n\n

Le bon vieux setTimeout()

\n

Avant l'ère de async/await, nous utilisions setTimeout(). Il est toujours vivant et pertinent, mais nécessite des callbacks, ce qui engendre « l'enfer des rappels ».

\n\n
console.log('Début');\nsetTimeout(() => {\n    console.log('1,5 seconde s\'est écoulée');\n}, 1500);\nconsole.log('Fin (exécutée immédiatement)');\n
\n\n

La sortie dans la console sera : Début, puis Fin (instantanément), et seulement ensuite 1,5 seconde s'est écoulée. Ce n'est pas tout à fait un sleep() au sens classique, mais pour des scénarios simples, c'est idéal.

\n\n

Quand utiliser setTimeout ?

\n
    \n
  • Lorsque vous devez exécuter une action une seule fois après un certain temps.
  • \n
  • Dans les animations (par exemple, lancer un effet après 300 ms).
  • \n
  • Dans des scripts simples sans logique complexe.
  • \n
\n\n

Le sleep bloquant (et pourquoi il ne faut pas le faire)

\n

Oui, techniquement, vous pouvez geler le thread avec une boucle vide. Mais c'est un mal pur.

\n\n
function blockSleep(milliseconds) {\n    const start = Date.now();\n    while (Date.now() - start < milliseconds) {\n        // Vide — le processeur chauffe, l'onglet se fige\n    }\n}\n\nconsole.log('Début');\nblockSleep(3000);\nconsole.log('3 secondes se sont écoulées (mais le navigateur a gelé)');\n
\n\n

Ce code fait exactement ce que vous demandez : il arrête l'exécution

Blogs

Book Recommendations