Dormir en Node.js

Isaac Tony 12 octobre 2023
  1. Utilisez la méthode setTimeout() pour planifier l’exécution de codes dans Node.js
  2. Utilisez la méthode setInterval() pour planifier l’exécution de codes dans Node.js
  3. Utilisez le mot-clé await() pour suspendre l’exécution des codes dans Node.js
Dormir en Node.js

Dans Node.js (ou la programmation en général), il existe des scénarios dans lesquels nous avons besoin d’un certain code ou script exécuté périodiquement. Node.js nous fournit deux fonctions intégrées que nous pouvons utiliser pour planifier l’exécution de fonctions dans Node.js et JavaScript.

Ces méthodes sont ci-dessous.

  1. setTimeout()
  2. setInterval()

Utilisez la méthode setTimeout() pour planifier l’exécution de codes dans Node.js

La méthode setTimeout() est une méthode asynchrone qui permet d’exécuter une fonction une fois après des intervalles de temps donnés. La fonction setTimeout() accepte de nombreux paramètres, dont deux sont obligatoires tandis que les autres sont facultatifs.

  1. La fonction à exécuter après l’intervalle de temps défini
  2. Le nombre en millisecondes que la minuterie attendra avant d’exécuter la fonction spécifiée
  3. Une partie du code qui s’exécutera après l’heure définie est supérieure à tout autre argument spécifié dans la fonction à exécuter.

Cette fonction retourne un entier appelé timeout ID qui peut référencer l’objet créé par la fonction setTimeout().

Voici un exemple simple d’utilisation de la fonction setTimeout() pour exécuter des fonctions à un intervalle de temps différent spécifié en millisecondes.

setTimeout(() => {console.log('This is the first function')}, 2000);
setTimeout(() => {console.log('This is the second function')}, 4000);
setTimeout(() => {console.log('This is the final function')}, 5000);

Exemple de sortie :

This is the first function
This is the second function
This is the final function

Dans l’exemple ci-dessus, il y a un temps d’attente de 2 secondes avant l’exécution de la première et de la seconde fonctions et un temps d’attente de 1 seconde avant l’exécution de la dernière fonction.

Maintenant, puisque le setTimeout() est une fonction asynchrone, nous pourrions à la place exécuter la fonction finale. Dans le même temps, la deuxième fonction attend en arrière-plan et fait exécuter la première fonction en dernier avec un temps d’attente de 2 secondes entre chaque fonction.

setTimeout(() => {console.log('This is the first function')}, 6000);
setTimeout(() => {console.log('This is the second function')}, 4000);
setTimeout(() => {console.log('This is the final function')}, 2000);

Exemple de sortie :

This is the final function
This is the second function
This is the first function

Le setTimeout() est vraiment utile lorsqu’il est utilisé avec des fonctions de rappel pour définir les fonctions de rappel à exécuter après un certain temps. Voici une fonction de rappel simple configurée pour s’exécuter après 4 secondes.

const displayFunction =
    () => {
      console.log('Code to be executed by the display function!');
      // some more code
    }

// function may contain more parameters
setTimeout(displayFunction, 4000);

Exemple de sortie :

Code to be executed by the display function!

Une approche plus précise et préférable de réécriture du code à l’aide d’une fonction fléchée est présentée ci-dessous.

setTimeout(() => {console.log('Code to be executed by the function!')}, 4000)

Exemple de sortie :

Code to be executed by the function!

Utilisez la méthode setInterval() pour planifier l’exécution de codes dans Node.js

Le module timers nous fournit également la méthode setInterval(), dont la fonctionnalité est similaire à la méthode setTimeout(). Cependant, contrairement à la méthode setTimeout(), la méthode setInterval() nous permet d’exécuter un script de manière répétée à des intervalles donnés jusqu’à ce qu’il soit explicitement arrêté.

La méthode setInterval() accepte deux paramètres obligatoires : la fonction à exécuter et l’intervalle de temps d’exécution. Nous pouvons également ajouter des paramètres optionnels supplémentaires à la fonction.

La méthode renvoie un objet connu sous le nom d’ID de minuterie qui peut être utilisé pour annuler la minuterie. Voici un exemple simple d’implémentation de la méthode setInterval().

setInterval(() => {
  console.log('Function repeatedly executed after every 2 seconds!');
}, 2000)

Exemple de sortie :

Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
^C

Cette fonction s’exécutera à plusieurs reprises à moins d’être interrompue à l’aide d’une interruption clavier en appuyant sur CTRL+C. Une façon plus conventionnelle d’arrêter la méthode setInterval() après un certain nombre d’exécutions est d’utiliser la fonction clearInterval().

Nous pouvons le faire en passant l’ID renvoyé par la méthode setInterval() en tant que paramètre à clearInterval(), comme indiqué ci-dessous.

const id = setInterval(() => {
  console.log('Function repeatedly executed after every 2 seconds!');
}, 2000)

clearInterval(id);

Nous pouvons également utiliser la méthode setTimeout() aux côtés de la méthode clearInterval() pour arrêter la méthode setInterval() après un certain nombre de secondes.

Voici un exemple simple de la même chose.

const id = setInterval(() => {
  console.log('Function repeatedly executed after every 2 seconds!');
}, 2000)

setTimeout(
    () => {
      clearInterval(id),
      console.log('Function stopped after 10 seconds!')
    },
    10000)

Exemple de sortie :

Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function stopped after 10 seconds!

Utilisez le mot-clé await() pour suspendre l’exécution des codes dans Node.js

Contrairement à d’autres langages de programmation comme le C qui proposent une fonction sleep, qui permet de mettre en veille un thread donné en attendant qu’un autre s’exécute, JavaScript n’a pas cette fonction.

Cependant, en utilisant une fonction basée sur une promesse asynchrone, nous pouvons utiliser le mot-clé await() pour suspendre l’exécution d’un morceau de code jusqu’à ce que cette promesse soit remplie en premier.

Nous nommerons cette fonction sleep(); cependant, cela ne vous empêche pas de lui donner tout autre nom que vous jugerez approprié.

Sous la fonction async, nous avons utilisé le mot-clé await() pour suspendre la deuxième fonction console.log() jusqu’à ce que la promesse soit résolue ; cela prend en moyenne 4 secondes. La valeur retournée par la promesse est considérée comme une valeur de retour de l’expression await().

async function my_asyncFunction() {
  console.log('Some Code we want to be executed');
  await sleep(4000);
  console.log('Some other code we want to be executed after some seconds');
}

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

my_asyncFunction();

Exemple de sortie :

Some Code we want to be executed
Some other code we want to be executed after some seconds

Nous ne pouvons pas encore utiliser l’expression await() en dehors des fonctions async dans le code Javascript normal. Toute tentative d’utilisation de cette syntaxe renvoie une erreur de syntaxe.

async function my_asyncFunction() {
  console.log('Some Code we want to be executed');

  console.log('Some other code we want to be executed after some seconds');
}

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

my_asyncFunction();

Exemple de résultat :

E:\Tonyloi>await.js:7
await sleep(4000);
^^^^^

SyntaxError: await is only valid in async functions and the top level bodies of modules
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1031:15)
    at Module._compile (node:internal/modules/cjs/loader:1065:27)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47

Cependant, nous pouvons utiliser l’expression await en dehors de la fonction async dans la syntaxe du module JavaScript.

Auteur: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn