Node.js Generators et comparer avec les rappels
Dans ce tutoriel, nous allons dรฉcouvrir Generators et leurs diffรฉrences avec les rappels
Que sont les gรฉnรฉrateurs ?
Generators sont devenus assez cรฉlรจbres dans Node.js ces derniers temps et cela est probablement dรป ร ce dont ils sont capables de faire.
- GeneratorLes s sont des exรฉcutions de fonctions qui peuvent รชtre suspendues et reprises ultรฉrieurement.
- GeneratorLes s sont utiles lors de la mise en ลuvre de concepts tels que ยซl'exรฉcution paresseuseยป. Cela signifie essentiellement qu'en suspendant l'exรฉcution et en reprenant ร volontรฉ, nous sommes en mesure d'extraire des valeurs uniquement lorsque nous en avons besoin.
Generators ont les 2 mรฉthodes clรฉs ci-dessous.
- Mรฉthode de rendement โ La mรฉthode Yield est appelรฉe dans une fonction pour arrรชter l'exรฉcution de la fonction ร la ligne spรฉcifique oรน la mรฉthode Yield est appelรฉe.
- Mรฉthode suivante โ Cette mรฉthode est appelรฉe depuis lโapplication principale pour reprendre lโexรฉcution dโune fonction qui possรจde une mรฉthode rendement. L'exรฉcution de la fonction se poursuivra jusqu'ร la prochaine mรฉthode rendement ou jusqu'ร la fin de la mรฉthode.
Regardons un exemple de la faรงon dont les gรฉnรฉrateurs peuvent รชtre utilisรฉs.
Dans notre exemple, nous allons avoir une simple fonction Add qui ajoutera 2 nombres, mais nous continuerons ร arrรชter l'exรฉcution de la mรฉthode ร diffรฉrents moments pour montrer comment les gรฉnรฉrateurs peuvent รชtre utilisรฉs.
function* Add(x) {
yield x + 1;
var y = yield(null);
y = 6
return x + y;
}
var gen = Add(5);
gen.next();
gen.next();
Explication du code
- La premiรจre รฉtape consiste ร dรฉfinir la ยซ fonction ยป de notre gรฉnรฉrateur. Notez que cela se fait en ajoutant un ยซ * ยป au mot-clรฉ function. Nous dรฉfinissons ensuite une fonction appelรฉe Add qui prend un paramรจtre de x.
- Le mot clรฉ rendement est spรฉcifique aux gรฉnรฉrateurs. Cela en fait une construction puissante pour suspendre une fonction au milieu de n'importe quoi. Donc ici, l'exรฉcution de la fonction sera interrompue jusqu'ร ce que nous invoquions la fonction next(), ce qui sera effectuรฉ ร l'รฉtape 4. ร ce stade, la valeur de x deviendra 6 et lโexรฉcution de la fonction sera arrรชtรฉe.
- C'est ici que nous appelons pour la premiรจre fois la fonction gรฉnรฉratrice et envoyons la valeur 5 ร notre fonction Add. Cette valeur sera substituรฉe dans le paramรจtre x de notre fonction Add.
- Une fois que nous appellerons la fonction next(), la fonction Add() reprendra l'exรฉcution. Lorsque la prochaine instruction var y= rendement(null) sera exรฉcutรฉe, la fonction Add() cessera ร nouveau de s'exรฉcuter.
- Maintenant, aprรจs avoir appelรฉ ร nouveau la fonction next(), les instructions suivantes seront exรฉcutรฉes et la valeur combinรฉe de x=5 et y=6 sera ajoutรฉe et renvoyรฉe.
Rappels vs gรฉnรฉrateurs
GeneratorLes s sont utilisรฉs pour rรฉsoudre le problรจme de ce que lโon appelle lโenfer des rappels. Parfois, les fonctions de rappel deviennent tellement imbriquรฉes lors du dรฉveloppement d'une application Node.js qu'il devient tout simplement trop compliquรฉ d'utiliser des fonctions de rappel.
C'est lร que les gรฉnรฉrateurs sont utiles. Lโun des exemples les plus courants est celui de la crรฉation de fonctions de minuterie.
Voyons l'exemple ci-dessous de la faรงon dont les gรฉnรฉrateurs peuvent s'avรฉrer utiles lors des rappels.
Notre exemple va simplement crรฉer une simple fonction de temporisation. On voudrait alors appeler cette fonction intรฉgrant un retard de 1000, 2000 et 3000 ms.
รtape 1) Dรฉfinissez notre fonction de rappel avec le code de temporisation nรฉcessaire.
function Timedelay(ptime, callback) {
setTimeout(function() {
callback("Pausing for " + ptime);
}, time);
}
Explication du code
- Ici, nous crรฉons une fonction appelรฉe Timedelay avec un paramรจtre appelรฉ ptime. Cela prendra le dรฉlai nรฉcessaire que nous souhaitons introduire dans notre application.
- L'รฉtape suivante consiste simplement ร crรฉer un message qui sera affichรฉ ร l'utilisateur indiquant que l'application va รชtre en pause pendant plusieurs millisecondes.
รtape 2) Regardons maintenant le code si nous incorporions des rappels. Supposons que nous voulions incorporer des rappels basรฉs sur la valeur de 1000 2000, 3000 et millisecondes, le code ci-dessous montre comment nous aurions besoin de les implรฉmenter ร l'aide de rappels.
Timedelay(1000, function(message) {
console.log(msg);
Timedelay(2000, function(message) {
console.log(msg);
Timedelay(3000, function(message) {
console.log(msg);
})
})
})
Explication du code
- Nous appelons le Timedelay comme un rappel avec 1000 comme valeur.
- Ensuite, nous voulons appeler ร nouveau la fonction Timedelay avec 2000 comme valeur.
- Enfin, nous souhaitons appeler ร nouveau la fonction Timedelay avec 3000 comme valeur.
ร partir du code ci-dessus, vous pouvez voir que cela devient plus compliquรฉ car nous voulons commencer ร appeler la fonction plusieurs fois.
รtape 3) Voyons maintenant comment implรฉmenter le mรชme code ร l'aide de gรฉnรฉrateurs. ร partir du code ci-dessous, vous pouvez maintenant voir ร quel point il est devenu simple d'implรฉmenter la fonction Timedelay ร l'aide de gรฉnรฉrateurs.
function* Messages() {
console,log(yield(Timedelay(1000, function(){})));
console,log(yield(Timedelay(2000, function(){})));
console,log(yield(Timedelay(3000, function(){})));
}
Explication du code
- Nous dรฉfinissons d'abord une fonction gรฉnรฉratrice qui sera utilisรฉe pour appeler notre fonction Timedelay.
- Nous appelons la fonction Yield avec la fonction Timedelay avec 1000 comme valeur de paramรจtre.
- Nous appelons ensuite la fonction Yield avec la fonction Timedelay avec 2000 comme valeur de paramรจtre.
- Enfin, nous appelons la fonction Yield avec la fonction Timedelay avec 3000 comme valeur de paramรจtre.
Rรฉsumรฉ
Generators peuvent รฉgalement รชtre utilisรฉs pour attรฉnuer les problรจmes liรฉs aux rappels imbriquรฉs et aider ร supprimer ce que l'on appelle l'enfer des rappels. Generators sont utilisรฉs pour arrรชter le traitement dโune fonction. Ceci est accompli en utilisant la mรฉthode ยซ rendement ยป dans la fonction asynchrone.




