Generator
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
L'objet Generator
est renvoyé par une fonction génératrice, c'est à la fois un itérateur et un itérable.
Syntaxe
function* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen(); // "Generator { }"
Méthodes
Generator.prototype.next()
-
Renvoie une valeur générée par l'expression
yield
. Generator.prototype.return()
-
Renvoie la valeur donnée et termine le générateur.
Generator.prototype.throw()
-
Lève une exception dans un générateur. Cette opération termine le générateur, sauf si l'exception est interceptée dans le générateur.
Exemple
Un itérateur infini
function* idMaker() {
var index = 0;
while (true) yield index++;
}
var gen = idMaker(); // "Generator { }"
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...
Générateurs historiques
Firefox (SpiderMonkey) implémente également une version antérieure pour les générateurs avec JavaScript 1.7. Pour cette syntaxe, il n'y a pas besoin d'utiliser l'astérisque dans la déclaration de la fonction, il suffit d'utiliser le mot-clé yield
dans le corps de la fonction. Les générateurs historiques sont une fonctionnalité dépréciée et seront supprimés à l'avenir (bug Firefox 1083482), il est fortement déconseillé de les utiliser.
Méthodes pour les générateurs historiques
Generator.prototype.next()
Non standard-
Renvoie une valeur générée par l'expression
yield
. Cette méthode correspond ànext()
pour les générateurs ES2015. Generator.prototype.close()
Non standard-
Clôture le générateur, tout appel ultérieur à
next()
renverra une exceptionStopIteration
. Cela correspond à la méthodereturn()
pour les générateurs ES2015. Generator.prototype.send()
Non standard-
Utilisée pour envoyer une valeur à un générateur. La valeur est renvoyée avec une expression
yield
et renvoie une valeur générée par la prochaine expressionyield
.send(x)
correspond ànext(x)
pour les générateurs ES2015. Generator.
prototype.
throw()
Non standard-
Lève une exception au sein d'un générateur. Cela correspond à la méthode
throw()
pour les générateurs ES2015.
Exemple utilisant un générateur historique
function* fibonacci() {
var a = yield 1;
yield a * 2;
}
var it = fibonacci();
console.log(it); // "Generator { }"
console.log(it.next()); // 1
console.log(it.send(10)); // 20
console.log(it.close()); // undefined
console.log(it.next()); // throws StopIteration (le générateur est clôturé)
Spécifications
Specification |
---|
ECMAScript Language Specification # sec-generator-objects |
Compatibilité des navigateurs
BCD tables only load in the browser
Voir aussi
Générateurs historiques
Générateurs ES2015
- Fonctions
function
- L'expression
function
Function
function*
- L'expression
function*
GeneratorFunction
- Le protocole Iterator