Le mot-clé yield est utilisé pour suspendre et reprendre une fonction génératrice (function* ou une fonction génératrice historique).

Syntaxe

[[rv =]] yield [[expression]];
expression
Définit la valeur à retourner depuis la fonction génératrice via le protocole itérateur. Si omise, undefined sera retournée à la place.
rv
Retourne la valeur optionnelle passée à la méthode next() pour reprendre son exécution.

Description

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 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 ;

  • 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 undefined et done est true ;

  • une instruction 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 à Generator.prototype.next(), les générateurs offrent énormément de puissance et de contrôle.

Exemples

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écifications

Spécification Statut Commentaires
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'Yield' dans cette spécification.
Standard Définition initiale.
ECMAScript Latest Draft (ECMA-262)
La définition de 'Yield' dans cette spécification.
Projet  

Compatibilité des navigateurs

Update compatibility data on GitHub
OrdinateurMobileServeur
ChromeEdgeFirefoxInternet ExplorerOperaSafariWebview AndroidChrome pour AndroidEdge MobileFirefox pour AndroidOpera pour AndroidSafari pour iOSSamsung InternetNode.js
Support simpleChrome Support complet 39Edge Support complet OuiFirefox Support complet 26
Notes
Support complet 26
Notes
Notes Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
IE Aucun support NonOpera Support complet OuiSafari Support complet 10WebView Android Support complet 39Chrome Android Support complet 39Edge Mobile Support complet OuiFirefox Android Support complet 26
Notes
Support complet 26
Notes
Notes Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
Opera Android Support complet OuiSafari iOS Support complet 10Samsung Internet Android Support complet 4.0nodejs Support complet 4.0.0
Support complet 4.0.0
Support complet 0.12
Désactivée
Désactivée From version 0.12: this feature is behind the --harmony runtime flag.
IteratorResult object instead of throwingChrome ? Edge ? Firefox Support complet 29IE Aucun support NonOpera ? Safari Support complet 10WebView Android ? Chrome Android ? Edge Mobile ? Firefox Android Support complet 29Opera Android ? Safari iOS Support complet 10Samsung Internet Android ? nodejs ?

Légende

Support complet  
Support complet
Aucun support  
Aucun support
Compatibilité inconnue  
Compatibilité inconnue
Voir les notes d'implémentation.
Voir les notes d'implémentation.
Une action explicite de l'utilisateur est nécessaire pour activer cette fonctionnalité.
Une action explicite de l'utilisateur est nécessaire pour activer cette fonctionnalité.

Notes spécifiques à Firefox

  • À partir de Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), une fonction génératrice terminée ne déclenche plus une 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 ES2015 (bug 981599):
    • L'expression après le mot-clé yield est optionnelle et l'omettre ne déclenche plus une SyntaxError : function* compteVentesPommes() { yield; }

Voir aussi

Étiquettes et contributeurs liés au document

Dernière mise à jour par : SphinxKnight,