--- title: yield slug: Web/JavaScript/Reference/Opérateurs/yield tags: - ECMAScript 2015 - Générateurs - Itérateur - JavaScript - Opérateur translation_of: Web/JavaScript/Reference/Operators/yield ---
Le mot-clé yield
est utilisé pour suspendre et reprendre une fonction génératrice ({{jsxref("Statements/function*", "function*")}} ou une fonction génératrice historique).
Le code source de cet exemple interactif est disponible dans un dépôt GitHub. Si vous souhaitez contribuez à ces exemples, n'hésitez pas à cloner https://github.com/mdn/interactive-examples et à envoyer une pull request !
[[rv =]] yield [[expression]];
expression
undefined
sera retournée à la place.rv
next()
pour reprendre son exécution.Le mot-clé yield
suspend une fonction génératrice et la valeur de l'expression suivant le mot-clé yield
est retournée à l'appelant du générateur. Il peut être vu comme une version générateur du mot-clé return
.
Le mot-clé yield
ne peut être appelé qu'à partir de la fonction génératrice qui le contient. Il ne peut pas être utilisé depuis des fonctions imbriquées ou avec des callbacks.
Le mot-clé yield
retourne en fait un objet IteratorResult
ayant deux propriétés, value
et done.
La propriété value
est le résultat de l'évaluation de l'expression yield
, et done
est false
, indiquant que la fonction génératrice n'est pas complètement terminée.
Une fois suspendue sur une expression yield
, l'exécution du code du générateur reste suspendue jusqu'à ce que la méthode next()
du générateur soit appelée. Chaque fois que la méthode next()
du générateur est appelée, le générateur reprend l'exécution et s'exécute jusqu'à ce qu'elle atteigne l'une des situations suivantes :
un yield
, ce qui provoque une nouvelle pause du générateur et retourne la nouvelle valeur du générateur ; la prochaine fois que next()
sera appelé, l'exécution reprendra à l'instruction immédiatement après le yield
;
{{jsxref ("Statements/throw", "throw")}} est utilisé pour déclencher une exception depuis le générateur ; cela arrête entièrement l'exécution du générateur et l'exécution reprend dans l'appelant, comme c'est normalement le cas lorsqu'une exception est déclenchée ;
la fin de la fonction génératrice est atteinte ; dans ce cas, l'exécution du générateur se termine et un IteratorResult
est retourné à l'appelant, dans lequel la valeur est {{jsxref ("undefined")}} et done
est true
;
une instruction {{jsxref ("Statements/return", "return")}} est atteinte ; dans ce cas, l'exécution du générateur se termine et un IteratorResult
est retourné à l'appelant dans lequel la value
est la valeur spécifiée par l'instruction return
et done
vaut true
.
Si une valeur optionnelle est passée à la méthode next()
du générateur, cette valeur devient la valeur retournée par l'opération yield
en cours du générateur.
Entre le chemin de code du générateur, ses opérateurs yield
, et la possibilité de spécifier une nouvelle valeur de départ en la passant à {{jsxref ("Generator.prototype.next()")}}, les générateurs offrent énormément de puissance et de contrôle.
Le code suivant est la déclaration d'un exemple de fonction génératrice :
function* compteVentesPommes () {
var listeVentes = [3, 7, 5];
for (var i = 0; i < listeVentes.length; i++) {
yield listeVentes[i];
}
}
Une fois qu'une fonction génératrice est définie, elle peut être utilisée en construisant un itérateur comme indiqué.
var magasinPommes = compteVentesPommes(); // Générateur { }
console.log(magasinPommes.next()); // { value: 3, done: false }
console.log(magasinPommes.next()); // { value: 7, done: false }
console.log(magasinPommes.next()); // { value: 5, done: false }
console.log(magasinPommes.next()); // { value: undefined, done: true }
Spécification | Statut | Commentaires |
---|---|---|
{{SpecName('ES2015', '#prod-YieldExpression', 'Yield')}} | {{Spec2('ES2015')}} | Définition initiale. |
{{SpecName('ESDraft', '#prod-YieldExpression', 'Yield')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.operators.yield")}}
IteratorResult
tel que { value: undefined, done: true }
({{bug(958951)}}).yield
a été mise à jour afin d'être conforme aux spécifications ES2015 ({{bug(981599)}}):
yield
est optionnelle et l'omettre ne déclenche plus une {{jsxref("SyntaxError")}} : function* compteVentesPommes() { yield; }