Générateurs

Frontend SELF FR
Niveau 45 , Leçon 1
Disponible

2.1 Syntaxe des générateurs

Les générateurs en JavaScript sont des fonctions spéciales qui permettent de contrôler l'exécution du code. Ils peuvent suspendre leur exécution et la reprendre plus tard, ce qui en fait un outil puissant pour travailler avec du code asynchrone, des itérateurs et d'autres tâches complexes.

Les générateurs sont définis à l'aide de la fonction function* (note bien l'étoile). À l'intérieur d'un générateur, on utilise l'opérateur yield pour suspendre l'exécution et retourner une valeur.

Déclaration d'un générateur :

JavaScript
    
      function* generatorFunction() {
        yield 1;
        yield 2;
        yield 3;
      }
    
  

Création d'un objet générateur

Appeler un générateur ne l'exécute pas immédiatement. À la place, ça retourne un objet générateur, que tu peux utiliser pour itérer sur les valeurs :

JavaScript
    
      const gen = generatorFunction();
    
  

2.2 Utilisation des générateurs

Méthode next()

La méthode next() est utilisée pour reprendre l'exécution du générateur jusqu'au prochain opérateur yield. Elle retourne un objet avec deux propriétés :

  • value: la valeur retournée par l'opérateur yield
  • done: un booléen qui indique si le générateur est terminé (true) ou non (false)

Exemple d'utilisation de la méthode next() :

JavaScript
    
      function* generatorFunction() {
        yield 1;
        yield 2;
        yield 3;
      }

      const gen = generatorFunction();

      console.log(gen.next()); // { value: 1, done: false }
      console.log(gen.next()); // { value: 2, done: false }
      console.log(gen.next()); // { value: 3, done: false }
      console.log(gen.next()); // { value: undefined, done: true }
    
  

Itération sur un générateur

Les générateurs peuvent être utilisés avec la boucle for...of pour itérer sur les valeurs.

Exemple d'itération sur un générateur :

JavaScript
    
      function* generatorFunction() {
        yield 1;
        yield 2;
        yield 3;
      }

      const gen = generatorFunction();

      for (const value of gen) {
        console.log(value);
      }

      // Affichera : 1
      // Affichera : 2
      // Affichera : 3
    
  

Exemple de retour de valeurs

Les générateurs peuvent retourner une valeur en utilisant l'opérateur return :

JavaScript
    
      function* generatorFunction() {
        yield 1;
        yield 2;
        return 3;
        yield 4; // Ce yield ne sera jamais exécuté
      }

      const gen = generatorFunction();

      console.log(gen.next()); // { value: 1, done: false }
      console.log(gen.next()); // { value: 2, done: false }
      console.log(gen.next()); // { value: 3, done: true }
      console.log(gen.next()); // { value: undefined, done: true }
    
  

2.3 Utilisation avancée des générateurs

Interaction avec un générateur

La méthode next() peut prendre un argument qui est passé dans le générateur et peut être utilisé à l'intérieur.

Exemple de passage de valeurs dans un générateur :

JavaScript
    
      function* generatorFunction() {
        const value1 = yield 1;
        const value2 = yield value1 + 2;
        yield value2 + 3;
      }

      const gen = generatorFunction();

      console.log(gen.next()); // { value: 1, done: false }
      console.log(gen.next(10)); // { value: 12, done: false }
      console.log(gen.next(20)); // { value: 23, done: false }
      console.log(gen.next()); // { value: undefined, done: true }
    
  

Gestion des erreurs

Les générateurs permettent de gérer les erreurs à l'aide du bloc try...catch.

Exemple de gestion des erreurs :

JavaScript
    
      function* generatorFunction() {
        try {
          yield 1;
          yield 2;
        } catch (error) {
          console.log('Erreur capturée :', error);
        }
      }

      const gen = generatorFunction();

      console.log(gen.next()); // { value: 1, done: false }
      console.log(gen.throw(new Error('Something went wrong'))); // Erreur capturée : Error: Something went wrong

      // { value: undefined, done: true }
    
  

Exemple de générateur pour créer une séquence infinie

Les générateurs peuvent être utilisés pour créer des séquences infinies de valeurs :

JavaScript
    
      function* infiniteSequence() {
        let i = 0;
        while (true) {
          yield i++;
        }
      }

      const gen = infiniteSequence();

      console.log(gen.next().value); // 0
      console.log(gen.next().value); // 1
      console.log(gen.next().value); // 2

      // et ainsi de suite
    
  

2.4 Exemples d'utilisation pratique

Exemple 1 : Générateur pour itérer sur un objet

JavaScript
    
      function* objectEntries(obj) {
        const keys = Object.keys(obj);
        for (const key of keys) {
          yield [key, obj[key]];
        }
      }

      const obj = { a: 1, b: 2, c: 3 };
      const gen = objectEntries(obj);

      for (const [key, value] of gen) {
        console.log(`${key}: ${value}`);
      }

      // Affichera :
      // a: 1
      // b: 2
      // c: 3
    
  

Exemple 2 : Générateur pour implémenter un itérateur simple

JavaScript
    
      const myIterable = {
        *[Symbol.iterator]() {
          yield 1;
          yield 2;
          yield 3;
        }
      };

      for (const value of myIterable) {
        console.log(value);
      }

      // Affichera : 1
      // Affichera : 2
      // Affichera : 3
    
  

Les générateurs en JavaScript sont un outil puissant pour contrôler l'exécution du code, créer des itérateurs et travailler avec des opérations asynchrones. Comprendre la syntaxe et l'utilisation des générateurs aide à créer du code plus flexible et lisible, surtout lorsqu'on traite des séquences de données et des tâches asynchrones.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION