Comment implémenter une fonction de pause en JavaScript : techniques de délai asynchrones expliquées

目次

1. Introduction

JavaScript est un langage de programmation largement utilisé à la fois côté frontend et backend. Cependant, contrairement à de nombreux autres langages, il ne fournit pas de fonction sleep intégrée en tant que fonctionnalité standard.

Une fonction sleep est généralement utilisée pour mettre en pause l’exécution pendant une période de temps spécifiée. Par exemple, elle peut être utile pour insérer de courts délais après la récupération de données ou lors du contrôle des animations de l’interface utilisateur (UI).

Cependant, comme JavaScript est un langage monothread conçu pour gérer efficacement le traitement asynchrone, une fonction sleep bloquante synchrone n’existe pas par conception.

Objectif de cet article

Cet article explique des méthodes concrètes pour implémenter un comportement similaire à sleep en JavaScript. En partant d’exemples de code basiques et en allant vers des implémentations plus avancées, il est rédigé de manière à être compréhensible même pour les débutants tout en offrant des connaissances pratiques pour une utilisation réelle.

De plus, la relation entre le traitement asynchrone et la boucle d’événements est expliquée, ainsi que les mises en garde importantes, afin d’aider les lecteurs à acquérir une compréhension solide du fonctionnement interne de JavaScript.

Public cible

Cet article s’adresse aux lecteurs suivants :

  • Débutants en JavaScript qui comprennent la syntaxe de base mais ne sont pas encore à l’aise avec le traitement asynchrone.
  • Développeurs qui se demandent pourquoi JavaScript n’a pas de fonction sleep intégrée et souhaitent découvrir des implémentations alternatives.
  • Ceux qui ont besoin d’une logique de délai pour les requêtes API ou le contrôle d’animations dans des applications réelles.

Ce qui suit

Dans l’article suivant, intitulé « Implémentation de base d’une fonction sleep en JavaScript », nous nous concentrerons sur l’approche la plus simple en utilisant la fonction setTimeout.

Cet article comprendra des exemples de code concrets et présentera également des implémentations plus avancées utilisant Promise et async/await.

2. Implémentation de base d’une fonction sleep en JavaScript

JavaScript ne fournit pas de fonction sleep intégrée, mais un comportement similaire peut être obtenu grâce au traitement asynchrone. Dans cette section, nous présentons deux approches fondamentales d’implémentation.

2-1. Exécution différée avec setTimeout

En JavaScript, la fonction setTimeout vous permet d’exécuter du code après un délai spécifié. En exploitant cette fonction, vous pouvez implémenter un mécanisme simple similaire à sleep.

Syntaxe de base

setTimeout(callback, milliseconds);

Exemple

Le code suivant affiche un message dans la console après une seconde.

console.log("Start");

setTimeout(() => {
  console.log("Executed after 1 second");
}, 1000);

console.log("End");

Résultat d’exécution

Start  
End  
Executed after 1 second

2-2. Implémentation avec Promise et async/await

Pour faciliter le contrôle de la logique asynchrone, vous pouvez implémenter une fonction sleep en utilisant Promise et async/await.

Implémentation d’une fonction sleep avec Promise

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

console.log("Start");

sleep(1000).then(() => {
  console.log("Executed after 1 second");
});

console.log("End");

2-3. Implémentation plus concise avec async/await

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  console.log("Start");
  await sleep(1000); // wait for 1 second
  console.log("Executed after 1 second");
  console.log("End");
}

demo();

2-4. Résumé

Dans cette section, nous avons présenté les méthodes de base pour implémenter une fonction sleep en JavaScript.

  • setTimeout : Simple mais nécessite un contrôle asynchrone attentif.
  • Promise et async/await : Plus lisibles et adaptés aux applications pratiques.

3. Cas d’utilisation pratiques

Dans cette section, nous présentons des cas d’utilisation concrets qui appliquent la fonctionnalité similaire à sleep en JavaScript.

3-1. Définir le temps d’attente à l’intérieur des boucles

Exemple 1 : Contrôle des intervalles de récupération de données

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function fetchData() {
  const urls = [
    "https://api.example.com/data1",
    "https://api.example.com/data2",
    "https://api.example.com/data3"
  ];

  for (let url of urls) {
    const response = await fetch(url);
    const data = await response.json();
    console.log(data);

    // wait for 1 second
    await sleep(1000);
  }
}

fetchData();

3-2. Contrôle différé des animations UI

Exemple 2 : Affichage différé dans un diaporama

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function startSlideshow(images) {
  for (let img of images) {
    console.log(`Displaying: ${img}`); // using console output as a placeholder
    await sleep(2000); // wait for 2 seconds
  }
}

const imageList = ["image1.jpg", "image2.jpg", "image3.jpg"];
startSlideshow(imageList);

3-3. Ajustement des intervalles de requêtes API

Exemple 3 : Interrogation de l’API à intervalles fixes

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function pollAPI() {
  const endpoint = "https://api.example.com/status";

  while (true) {
    const response = await fetch(endpoint);
    const data = await response.json();
    console.log(`Fetched data: ${data.status}`);

    // Exit the loop based on a condition
    if (data.status === "complete") {
      console.log("Process completed");
      break;
    }

    // wait for 3 seconds
    await sleep(3000);
  }
}

pollAPI();

3-4. Résumé

  • Attente à l’intérieur des boucles : Utile pour contrôler les intervalles de récupération de données et l’ordre d’exécution.
  • Délais d’animation UI : Améliore l’expérience utilisateur en gérant les effets de synchronisation visuelle.
  • Contrôle des intervalles de requêtes API : Permet une surveillance dynamique des données via le polling.

4. Bonnes pratiques et considérations importantes

Vous avez appris comment implémenter et appliquer une fonctionnalité de type sleep en JavaScript, mais il existe plusieurs considérations importantes lors de son utilisation dans des applications réelles. Cette section présente les meilleures pratiques liées aux performances et à la gestion des erreurs.

4-1. Comprendre le traitement asynchrone et la boucle d’événements

JavaScript s’exécute sur un seul fil d’exécution et gère les opérations asynchrones via la boucle d’événements. Sans comprendre ce mécanisme, le code peut ne pas se comporter comme prévu.

Fonctionnement de la boucle d’événements

La boucle d’événements JavaScript traite les tâches dans l’ordre suivant :

  1. Pile d’appels : Les opérations synchrones sont empilées et exécutées dans l’ordre.
  2. File des tâches : Les rappels asynchrones (comme setTimeout ) sont ajoutés ici et exécutés une fois la pile d’appels vide.

Exemple : Observation du comportement de la boucle d’événements

console.log("Start");

setTimeout(() => {
  console.log("Timer finished");
}, 0);

console.log("End");

Résultat de l’exécution

Start  
End  
Timer finished

4-2. Considérations de performance

Une utilisation excessive de délais de type sleep peut nuire aux performances de l’application. Gardez à l’esprit les points suivants.

Mauvais exemple : Éviter les opérations bloquantes longues

const delay = Date.now() + 5000; // wait for 5 seconds
while (Date.now() < delay) {
  // busy waiting
}

Bon exemple : Attente avec traitement asynchrone

async function example() {
  console.log("Start");
  await sleep(5000); // wait for 5 seconds
  console.log("End");
}
example();

4-3. Mise en œuvre de la gestion des erreurs

Exemple : Gestion des erreurs dans les requêtes API

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function fetchDataWithRetry(url, retries = 3, delay = 1000) {
  for (let i = 0; i < retries; i++) {
    try {
      const response = await fetch(url);
      if (!response.ok) throw new Error(`HTTP Error: ${response.status}`);
      const data = await response.json();
      console.log(data);
      return; // exit on success
    } catch (error) {
      console.error(`Attempt ${i + 1}: Error occurred - ${error.message}`);
      await sleep(delay); // wait before retrying
    }
  }
  console.error("All retry attempts failed");
}

fetchDataWithRetry("https://api.example.com/data");

4-4. Summary

  • Understanding the event loop: Essential knowledge for predictable asynchronous behavior.
  • Performance optimization: Avoid blocking operations to maintain application responsiveness.
  • Error handling: Build robust code using retries and logging.
  • Environment differences: Understand browser and Node.js characteristics to choose the best approach.

5. Frequently Asked Questions (FAQ)

In this section, we address common questions readers often have about implementing a sleep function in JavaScript.

5-1. Is a “sleep” Function Really Necessary in JavaScript?

Question:
JavaScript is designed to handle asynchronous processing efficiently. Is a sleep function really necessary?

Answer:
A sleep-like function can be very useful in specific use cases, such as:

  • Adjusting API request intervals: Executing consecutive requests while reducing server load.
  • Controlling UI animations: Implementing slideshows or step-by-step visual effects.
  • Retry logic: Reattempting operations at fixed intervals after communication errors.

5-2. Why Doesn’t JavaScript Have a Built-in sleep Function?

Question:
Many other programming languages provide a built-in sleep function. Why doesn’t JavaScript?

Answer:
JavaScript is designed around asynchronous processing and uses an event loop to manage execution. This design ensures UI responsiveness and efficient task handling, making synchronous blocking functions like sleep undesirable by default.

5-3. What Is the Difference Between Synchronous and Asynchronous Processing?

Question:
I don’t fully understand the difference between synchronous and asynchronous processing.

Answer:
The difference can be illustrated with the following examples.

Synchronous Example:

console.log("Start");
for (let i = 0; i < 1e9; i++) {} // time-consuming operation
console.log("End");

Asynchronous Example:

console.log("Start");
setTimeout(() => {
  console.log("End");
}, 1000);
console.log("Processing");

5-4. What Should I Be Careful About When Using a sleep Function?

Question:
Are there any important points to keep in mind when using a sleep function?

Answer:

  1. Performance impact: Long delays can slow down overall execution.
  2. Avoid UI freezing: Always use asynchronous approaches instead of blocking loops.
  3. Error handling: Combine sleep logic with retry mechanisms for stability.

5-5. Summary

In this section, we addressed common questions about the sleep function in JavaScript.

  • JavaScript does not include a built-in sleep function, but equivalent behavior can be implemented using asynchronous techniques.
  • Practical answers to common questions help deepen real-world understanding.

6. Conclusion

6-1. Article Recap

1. The Need for a “sleep” Function in JavaScript

Although JavaScript does not provide a built-in sleep function, we explained how equivalent behavior can be achieved using asynchronous processing.

2. Implementation Methods

  • setTimeout: The most basic approach for delayed execution.
  • Promise and async/await: Easier control over asynchronous flow and improved readability.

3. Best Practices and Considerations

  • Comprendre la boucle d’événements : Expliquer comment l’exécution asynchrone fonctionne en interne.
  • Conscience des performances : Éviter les opérations bloquantes et écrire du code efficace.
  • Gestion des erreurs : Concevoir une logique robuste en utilisant des tentatives de nouvelle exécution et la journalisation.

6-2. Cas d’utilisation futurs

Une fonction similaire à sleep en JavaScript est utile dans de nombreux scénarios, du simple contrôle du timing aux flux de travail asynchrones avancés.

Applications pratiques de projet :

  • Interfaces utilisateur : Contrôler les animations des boutons et des formulaires.
  • Interrogation d’API : Surveiller périodiquement les dernières données.
  • Traitement par lots : Exécuter de grandes opérations de données à intervalles contrôlés pour gérer la charge du système.

6-3. Réflexions finales

En suivant cet article et en pratiquant avec du code réel, vous pouvez approfondir votre compréhension du comportement asynchrone de JavaScript. Appliquer les exemples et les meilleures pratiques présentés ici vous aidera à créer des applications plus flexibles, fiables et pratiques.

広告