Les générateurs sont des types spéciaux de fonctions en JavaScript qui peuvent être arrêtés et repris ultérieurement. Ceci est très utile pour gérer des opérations asynchrones sans utiliser de callbacks ou de promesses.
Voici comment les utiliser :
Définition d’un générateur
Pour définir un générateur en JavaScript, utilisez l’opérateur `function*` :
```
function* generatorFonction(){
yield ‘Hello’;
yield ‘World’;
}
```
Utilisation d’un générateur
Pour utiliser un générateur, vous devez d’abord l’instancier, puis appeler la méthode `next()` :
```
let generator = generatorFonction();
console.log(generator.next().value); // Hello
console.log(generator.next().value); // World
console.log(generator.next().value); // undefined (pas d’autres valeurs à produire)
```
Yield
L’instruction `yield` est utilisée pour mettre en pause et reprendre une fonction de générateur `(function* ou une fonction générée via un générateur)`.
```
function* countAppleSales () {
var saleList = [3, 7, 5];
for (var i = 0; i < saleList.length; i++) {
yield saleList[i];
}
}
var appleStore = countAppleSales(); // Generator
console.log(appleStore.next()); // { value: 3, done: false }
console.log(appleStore.next()); // { value: 7, done: false }
console.log(appleStore.next()); // { value: 5, done: false }
console.log(appleStore.next()); // { value: undefined, done: true }
```
Générateurs et Promesses
Les générateurs peuvent être utilisés avec les Promesses pour gérer les opérations asynchrones :
```
function* generatorFonction(){
var result = yield doAsyncOperation();
console.log(result);
}
function doAsyncOperation(){
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve(‘Résultat de l\‘opération asynchrone’);
}, 1000);
});
}
let generator = generatorFonction();
generator.next().value.then(function(result){
generator.next(result);
// Logs: ‘Résultat de l\‘opération asynchrone‘
});
```
Cela permet de gérer des opérations asynchrones de manière plus linéaire et compréhensible, et évite “l’enfer des callbacks”.