Generator

par 2 contributeurs :

Cette fonction, proposition pour ECMAScript 6 (Harmony), est expérimentale
Puisque cette fonction est toujours en développement dans certains navigateurs, veuillez consulter le tableau de compatibilité pour les préfixes à utiliser selon les navigateurs.
Il convient de noter qu'une fonctionnalité expérimentale peut voir sa syntaxe ou son comportement modifié dans le futur en fonction des évolutions de la spécification.

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.

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 1083482), il est fortement déconseillé de les utiliser.

Méthodes pour les générateurs historiques

Generator.prototype.next()
Renvoie une valeur générée par l'expression yield. Cette méthode correspond à next() pour les générateurs ES6.
Generator.prototype.close()
Clôture le générateur, tout appel ultérieur à next() renverra une exception StopIteration. Cela correspond à la méthode return() pour les générateurs ES6.
Generator.prototype.send()
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 expression yield. send(x) correspond à next(x) pour les générateurs ES6.
Generator.prototype.throw()
Lève une exception au sein d'un générateur. Cela correspond à la méthode throw() pour les générateurs ES6.

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

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

Compatibilité des navigateurs

Fonctionnalité Chrome Firefox (Gecko) Internet Explorer Opera Safari
Support simple 39.0 (Oui) Pas de support Pas de support Pas de support
Fonctionnalité Android Webview Android Chrome pour Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Support simple Pas de support 39.0 39.0 (Oui) Pas de support Pas de support Pas de support

Voir aussi

Générateurs historiques

Générateurs ES6

Étiquettes et contributeurs liés au document

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