Les générateurs sont des fonctions qui peuvent être quittées et ré-entrées ultérieurement. Leur contexte (liaisons de variables) sera sauvegardé à travers les ré-entrées.

Les générateurs en JavaScript — surtout lorsqu’ils sont combinés avec les Promesses — sont un outil très puissant pour la programmation asynchrone car ils atténuent — sinon éliminent entièrement — les problèmes avec les callbacks, tels que Callback Hell et Inversion of Control. Cependant, une solution encore plus simple à ces problèmes peut être obtenue avec les fonctions asynchrones.

L’appel d’une fonction génératrice n’exécute pas son corps immédiatement ; un objet itérateur pour la fonction est renvoyé à la place. Lorsque la méthode next() de l’itérateur est appelée, le corps de la fonction de générateur est exécuté jusqu’à la première expression yield, qui spécifie la valeur à retourner de l’itérateur ou, avec yield*, délègue à une autre fonction de générateur. La méthode next() renvoie un objet avec une propriété value contenant la valeur cédée et une propriété done qui indique si le générateur a cédé sa dernière valeur, sous forme de booléen. L’appel de la méthode next() avec un argument reprendra l’exécution de la fonction du générateur, remplaçant l’expression yield où une exécution a été interrompue par l’argument de next().

Une instruction return dans un générateur, lorsqu’elle est exécutée, fera en sorte que le générateur se termine (c’est-à-dire que la propriété done de l’objet retourné par celle-ci sera mise à true). Si une valeur est retournée, elle sera définie comme la propriété value de l’objet retourné par le générateur.
Comme une instruction return, une erreur est lancée à l’intérieur du générateur rendra le générateur terminé — sauf si elle est attrapée dans le corps du générateur.
Lorsqu’un générateur est terminé, les appels next() ultérieurs n’exécuteront aucun code de ce générateur, ils retourneront juste un objet de cette forme : {value: undefined, done: true}.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.