Les générateurs en Javascript

Les générateurs sont une alternative à l’utilisation d’itérateurs dont la création et l’utilisation peut parfois s’avérer complexe ou contraignante.

 

Les fonctions génératrices et l’objet Generator

On peut créer un générateur à partir d’un type spécial de fonction qu’on appelle « fonction génératrice ». Un générateur permet de retourner plusieurs valeurs à la différence des fonctions classiques qui ne peuvent retourner qu’une valeur.

Pour définir une fonction génératrice, nous allons devoir utiliser la syntaxe function* ainsi que le mot clef yield.

Création d'un générateur en JavaScript

Une chose importante à noter ici est qu’une fonction génératrice ne va pas pouvoir exécuter le code directement. Les fonctions génératrices servent d’usines à générateurs.

Lorsqu’on appelle notre fonction génératrice, un générateur (on objet Generator est retourné et c’est ce générateur qu’on va utiliser pour obtenir des valeurs. Notez que l’objet Generator retourné sera à la fois un itérateur et un itérable.

Appel d'une fonction générateur en JavaScript

L’objet Generator possède trois méthodes :

  • La méthode next() permet de renvoyer une valeur générée avec yield ;
  • La méthode return() renvoie une valeur et met fin à l’exécution du générateur ;
  • La méthode throw() permet de lever une exception au sein d’un générateur.

Nous aurons l’occasion de détailler le fonctionnement de ces méthodes plus loin dans cette leçon.

Notez que par simplification et par abus de langage, on confond souvent les termes « fonction génératrice » et « générateur » et on les utilise pour désigner le même objet.

 

Le mot clef yield et l’utilisation des générateurs

Le mot clef yield est semblable à return mais pour les générateurs. Lorsqu’on utilise ce mot clef, le générateur est suspendu et yield retourne un objet IteratorResult qui possède deux propriétés value et done.

La valeur de value correspond à la valeur suivant le mot clef yield. La valeur de done est false par défaut ce qui indique que le générateur n’a pas terminé son exécution.

Pour « relancer » le générateur, il faudra appeler la méthode next(). Le générateur va ainsi reprendre son exécution jusqu’à atteindre le prochain yield ou une instruction throw ou return ou encore la fin du générateur.

See the Pen
Cours JavaScript 13.3.1
by Pierre (@pierregiraud)
on CodePen.

L’une des grandes forces des générateurs réside dans leur flexibilité puisqu’on va pouvoir suspendre ou quitter un générateur grâce à yield puis continuer son exécution plus tard là où on s’était arrêté grâce à next().

 

La composition de générateurs

L’expression yield* est utilisée pour déléguer l’exécution à un autre générateur (ou à un autre objet itérable).

Concrètement, yield* va nous permettre d’exécuter le code d’un générateur à partir d’un autre générateur et donc de renvoyer les valeurs liées aux yield de ce premier générateur.

See the Pen
Cours JavaScript 13.3.2
by Pierre (@pierregiraud)
on CodePen.

Laisser un commentaire