Le mot-clé yield
est utilisé afin d'interrompre et de reprendre un générateur (une instruction (function*
ou un générateur historique).
Syntaxe
[[rv =]] yield [[expression]];
expression
- L'expression à renvoyer. Si l'expression est absente,
undefined
sera renvoyé. rv
- Lorsqu'on reprend l'exécution du générateur avec un appel à la méthode
next()
, on peut récupérer la valeur fournie ànext()
qui est alors la valeur de retour de l'expressionyield
dans le code du générateur.
Description
Le mot-clé yield
interrompt une fonction qui est un générateur et renvoie la valeur courant de l'expression suivant le mot-clé. Il peut être vu comme l'analogue du mot-clé return
pour les fonctions.
Le mot-clé yield
renvoie en fait un objet qui possède deux paramètres value
et done.
value
est le résultat de l'évaluation de l'expression suivant yield
, done
est un booléen indiquant si oui ou non le générateur a terminé.
Une fois que l'exécution d'un générateur a été interrompue par une instruction yield
, l'exécution ne peut être reprise que par un appel externe à la méthode next()
du générateur. Cela permet d'avoir un contrôle direct sur l'exécution du générateur et de disposer de valeurs de retour incrémentales.
Exemple
Le fragment de code qui suit correspond à la définition d'une fonction génératrice :
function* toto(){ var index = 0; while (index <= 2) // quand index atteint 3 // la propriété done sera vraie // et la propriété value sera undefined; yield index++; };
Une fois que le générateur est défini, on peut l'utiliser en construisant un itérateur dessus.
var iterator = toto(); console.log(iterator.next()); // { value: 0, done: false } console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: undefined, done: true }
Spécifications
Spécification | Statut | Commentaires |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) La définition de 'Yield' dans cette spécification. |
Standard | Initial definition. |
ECMAScript 2016 Draft (7th Edition, ECMA-262) La définition de 'Yield' dans cette spécification. |
Projet |
Compatibilité des navigateurs
Fonctionnalité | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Support simple | 39 | 26.0 (26.0) | ? | ? | ? |
objet IteratorResult plutôt qu'une exception |
? | 29.0 (29.0) | ? | ? | ? |
Fonctionnalité | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Support simple | (Oui) | 26.0 (26.0) | ? | ? | ? |
objet IteratorResult plutôt qu'une exception |
? | 29.0 (29.0) | ? | ? | ? |
Notes relatives à Firefox
- À partir de Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), une fonction génératrice terminée ne renvoie plus d'erreur
TypeError
"generator has already finished". À la place, elle renvoie un objetIteratorResult
tel que{ value: undefined, done: true }
(bug 958951). - À partir de Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), l'analyse de l'expression
yield
a été mise à jour afin d'être conforme aux spécifications ES6 (bug 981599):- L'expression qui se situe après le mot-clé
yield
est optionnelle, on n'a plus d'exceptionSyntaxError
lorsqu'elle est absente :function* toto() { yield; }
- L'expression qui se situe après le mot-clé
Voir aussi
- Le protocole itérateur
- L'instruction
function*
- L'expression
function*
- L'opérateur
yield*