Module Timers de Node.js

Java FileModules intégrés de Node.js


de Node.jstimersLe module fournit une série de fonctions permettant d'exécuter du code après un délai spécifié ou à intervalles réguliers de manière répétée. Ces fonctionnalités sont très utiles pour mettre en œuvre une exécution différée, des tâches périodiques et un contrôle des délais d'attente.

Bien quetimersle module est un module de base de Node.js, mais ses méthodes telles quesetTimeout(), setInterval()etsetImmediate()sont disponibles globalement sans importation explicite.


Fonctions de minuterie principales

setTimeout()

setTimeout()La fonction est utilisée pour exécuter une fonction de rappel une fois après un nombre spécifié de millisecondes.

Exemple

// Afficher un message après 2 secondes
setTimeout(() => {
  console.log('Ce message sera affiché après 2 secondes');
}, 2000);

Description du paramètre

  1. Fonction de rappel: La fonction à exécuter
  2. Temps de délai: Temps en millisecondes (1000 ms = 1 seconde)
  3. Paramètres facultatifs: Paramètres supplémentaires transmis à la fonction de rappel

Exemple

// Exemple avec des paramètres supplémentaires
setTimeout((name, age) => {
  console.log(`Bonjour, ${name}, vous avez ${age}ans`);
}, 1000, 'Zhang San', 25);

clearTimeout()

clearTimeout()Utilisé pour annuler unsetTimeout()minuteur précédemment défini.

Exemple

const timerId = setTimeout(() => {
  console.log('Ce message ne sera pas affiché');
}, 2000);

clearTimeout(timerId); // Annuler le minuteur

setInterval()

setInterval()La fonction est utilisée pour exécuter de manière répétée une fonction de rappel à des intervalles spécifiés en millisecondes.

Exemple

// Afficher un message toutes les 1 seconde
let counter = 0;
const intervalId = setInterval(() => {
  counter++;
  console.log(`Ceci est l'exécution ${counter}`);
  if (counter === 5) {
    clearInterval(intervalId); // Arrêter le minuteur
  }
}, 1000);

clearInterval()

clearInterval()Utilisé pour arrêter unsetInterval()minuteur répétitif défini précédemment.

Exemple

const intervalId = setInterval(() => {
  console.log('Ce message sera affiché de manière répétée');
}, 1000);

// Arrêter le minuteur après 5 secondes
setTimeout(() => {
  clearInterval(intervalId);
}, 5000);

setImmediate()

setImmediate()La fonction est utilisée pour exécuter une fonction de rappel à la fin de la boucle d'événements actuelle.

Exemple

console.log('Start');

setImmediate(() => {
  console.log('Fonction de rappel exécutée immédiatement');
});

console.log('Fin');

// Ordre de sortie :
// Début
// Fin
// Callback exécuté immédiatement

clearImmediate()

clearImmediate()Utilisé pour annuler unsetImmediate()callback immédiat.

Exemple

const immediateId = setImmediate(() => {
  console.log('Ce message ne sera pas affiché');
});

clearImmediate(immediateId);

Ordre d'exécution des minuteurs

Il est très important de comprendre la boucle d'événements de Node.js pour maîtriser l'ordre d'exécution des minuteurs. Voici l'ordre d'exécution de plusieurs minuteurs :

  1. Code synchrone: exécuté en premier
  2. process.nextTick(): exécuté immédiatement après la fin de la phase actuelle
  3. Fonctions de rappel de Promise: file d'attente des microtâches
  4. setImmediate(): exécuté après les fonctions de rappel d'E/S
  5. setTimeout() et setInterval(): exécutés dans la phase de vérification

Exemple

console.log('Start');

setTimeout(() => console.log('setTimeout'), 0);
setImmediate(() => console.log('setImmediate'));
process.nextTick(() => console.log('nextTick'));
Promise.resolve().then(() => console.log('Promise'));

console.log('Fin');

// Ordre de sortie typique :
// Début
// Fin
// nextTick
// Promise
// setTimeout
// setImmediate

Utilisation avancée et notes

Annulation des minuteurs

Toutes les fonctions de minuteur renvoient unTimeoutobjet, qui peut être utilisé pour annuler le minuteur. Il n'y a pas de risque à appeler la fonction d'annulation même si le minuteur s'est déjà exécuté.

Exemple

const timeout = setTimeout(() => {}, 1000);
clearTimeout(timeout); // Appel sans risque même si le minuteur s'est déjà exécuté

Précision des minuteurs

Les minuteurs Node.js ne garantissent pas un temps d'exécution précis ; ils représentent un temps d'attente minimum. La charge système et d'autres facteurs peuvent affecter le temps d'exécution réel.

Fuites de mémoire

Oublier d'annulersetInterval()Les timers sont une source courante de fuites de mémoire. Assurez-vous de les effacer lorsqu'ils ne sont plus nécessaires.

Exemple

// Mauvaise approche - peut causer une fuite de mémoire
setInterval(() => {
  // Effectuer une opération
}, 1000);

// Approche correcte - effacer le timer au moment approprié
const interval = setInterval(() => {
  // Effectuer une opération
  if (someCondition) {
    clearInterval(interval);
  }
}, 1000);

setTimeout récursif au lieu de setInterval

Pour les tâches qui nécessitent un intervalle fixe mais dont le temps d'exécution est incertain à chaque fois, utiliser un setTimeout récursifsetTimeoutComparersetIntervalest plus fiable.

Exemple

function doSomething() {
  console.log('Exécution de la tâche...');
 
  // Simuler un temps d'exécution incertain pour une tâche
  const delay = Math.random() * 1000;
 
  setTimeout(doSomething, 1000 + delay);
}

setTimeout(doSomething, 1000);

Exemples d'applications pratiques

Implémentation d'un compte à rebours simple

Exemple

function countdown(seconds) {
  let current = seconds;
 
  console.log(`Début du compte à rebours : ${current}seconds`);
 
  const timer = setInterval(() => {
    current--;
   
    if (current <= 0) {
      clearInterval(timer);
      console.log('Compte à rebours terminé !');
    } else {
      console.log(`Temps restant : ${current}seconds`);
    }
  }, 1000);
}

countdown(5);

Gestion des délais d’attente des requêtes

Exemple

function fetchWithTimeout(url, timeout = 5000) {
  return new Promise((resolve, reject) => {
    const timeoutId = setTimeout(() => {
      reject(new Error(`Délai d’attente de la requête (${timeout}ms)`));
    }, timeout);
   
    fetch(url)
      .then(response => {
        clearTimeout(timeoutId);
        resolve(response);
      })
      .catch(error => {
        clearTimeout(timeoutId);
        reject(error);
      });
  });
}

// Exemple d'utilisation
fetchWithTimeout('https://api.example.com/data')
  .then(data => console.log(data))
  .catch(error => console.error(error));

En maîtrisant letimersmodule de Node.js, vous pouvez contrôler efficacement le moment d’exécution du code et mettre en œuvre diverses tâches planifiées et flux de contrôle asynchrones.

Java FileModules intégrés de Node.js

Autres extensions