yield

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'expression yield 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 objet IteratorResult 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'exception SyntaxError lorsqu'elle est absente : function* toto() { yield; }

Voir aussi

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : necraidan, SphinxKnight, Justkant
 Dernière mise à jour par : necraidan,