Une expression yield*
est utilisée afin de déléguer le mécanisme d'itération/génération à un autre générateur
ou à un autre objet itérable.
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 !
Syntaxe
yield* [[expression]];
expression
- L'expression qui renvoie un objet itérable.
Description
L'expression yield*
itère sur l'opérande et génère chaque valeur générée par l'opérande.
La valeur de l'expression yield*
est la valeur renvoyée par l'itérateur lorsque celui est terminé (la propriété done
vaut true
).
Exemples
Délégation de la génération
Dans le code suivant, les valeurs générées par g1()
sont renvoyées grâce aux appels à la fonction next()
, comme pour celles renvoyées par g2()
.
function* g1() {
yield 2;
yield 3;
yield 4;
}
function* g2() {
yield 1;
yield* g1();
yield 5;
}
var iterator = g2();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
Les autres objets itérables
yield*
peut également être utilisé avec d'autres sortes d'itérables (chaînes, tableaux ou arguments) :
function* g3() {
yield* [1, 2];
yield* "34";
yield* Array.from(arguments);
}
var iterator = g3(5, 6);
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: "3", done: false }
console.log(iterator.next()); // { value: "4", done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: 6, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
La valeur de l'expression yield*
yield*
est une expression et non une instruction, elle est donc évaluée et fournit une valeur :
function* g4() {
yield* [1, 2, 3];
return "toto";
}
var résultat;
function* g5() {
résultat = yield* g4();
}
var iterator = g5();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true },
// g4() renvoie{ value: "toto", done: true } at this point
console.log(résultat); // "toto"
Spécifications
Spécification | État | Commentaires |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) La définition de 'Yield' dans cette spécification. |
Standard | Définition initiale |
ECMAScript (ECMA-262) La définition de 'Yield' dans cette spécification. |
Standard évolutif |
Compatibilité des navigateurs
BCD tables only load in the browser
Notes relatives à Firefox
- À partir de Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), l'analyse de l'expression
yield
a été mise à jour pour être conforme aux spécifications ES2015 (bug 981599) :- La restriction concernant les terminateurs de lignes est désormais implémentée. Il n'est pas autorisé d'avoir un terminateur de ligne entre "yield" et "*". Le code suivant lèvera une exception
SyntaxError
:function* toto() { yield *[]; }
- La restriction concernant les terminateurs de lignes est désormais implémentée. Il n'est pas autorisé d'avoir un terminateur de ligne entre "yield" et "*". Le code suivant lèvera une exception
Voir aussi
- Le protocole itérateur
- L'instruction
function*
- L'expression
function*
yield