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
.
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.
L’objet Generator
possède trois méthodes :
- La méthode
next()
permet de renvoyer une valeur générée avecyield
; - 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.