2. Dans Node, plusieurs objets émettent des événements. Par
exemple, un serveur TCP émet un événement « connect »
chaque fois qu’un client est connecté.
Ces objets sont, dans la nomenclature de Node, les émetteurs
d'événements. Les émetteurs d'événements permettre aux
programmeurs de s'abonner à des événements qui les
intéressent. Le programmeur attache une fonction de rappel
qui sera appelée chaque fois qu'un événement pertinent à
cet émetteur d'événements se produit. Ce modèle éditeur /
abonné est très semblable au modèle type GUI, lequel
un programme reçoit notification qu'un certain bouton a été
cliqué. En utilisant ce modèle, un programme côté serveur
peut réagir ,par exemple,lorsqu'un client se connecte au
serveur, les données sont disponibles sur une socket.
2par James Gaglo
3. Il s'agit d'un style dans lequel une fonction appelle une fonction
de rappel après l'opération soit terminée, afin que votre
programme puisse se poursuivre. Comme vous le verrez,
JavaScript se prête à ce type de programmation. Voici un
exemple de Node qui implique de charger un fichier en
mémoire:
var fs = require('fs');
fs.readFile('/etc/passwd', function(err, fileContent) {
if (err) {
throw err;
}
console.log('file content', fileContent.toString());
});
3par James Gaglo
4. Le modèle standard de rappel fonctionne bien
lorsque vous voulez que le client soit averti quand
une fonction a fini d'être exécutée.
Mais si plusieurs événements ont lieu lors de
l'exécution, ou si elles se produisent à plusieurs
reprises, ce style ne fonctionne pas bien.
Par exemple, si vous souhaitez être averti chaque fois
que des données sont disponibles sur un socket, le
modèle standard de rappel n'est pas très utile.
C'est alors que le modèle émetteur d'événements
peut aider. Vous pouvez utiliser une interface
standard pour séparer clairement l'émetteur
d'événements et de l'écouteur d'événements.
4par James Gaglo
5. Lorsque vous utilisez un modèle émetteur
d'événements, deux objets ou plus sont
impliquées, l'émetteur d'événements et un ou
plusieurs écouteurs d'événements.
Un émetteur d'événements est un objet qui,
comme son nom l'indique, émet des
événements. Un écouteur d'événement est une
partie du code qui se lie à l'émetteur
d'événements et est à l'écoute de certains types
d'événements, comme dans cet exemple:
5par James Gaglo
6. 1. var req = http.request(options, function(response)
{
2. response.on("data", function(data) {
3. console.log("some data from the response",
data);
4. });
5. response.on("end", function() {
6. console.log("response ended");
7. });
8. });
9. req.end();
6par James Gaglo
7. Ici, nous voyons quelques étapes nécessaires pour gérer
une requếte HTTP par un serverur HTTP utilisant
Node.
Ligne 1 utilise le style passage de continuation,
passant dans une fonction inline qui sera exécutée une fois
que la réponse est disponible. L'API HTTP request
utilise les CPS ici parce que le programme continue de
s'exécuter après la fonction http.request se termine.
Une fois terminée, la fonction http.request appelle le
rappel, en passant un objet de réponse. Cet
objet de réponse est un émetteur d'événements et, selon la
documentation de Node, peut émettre, entre
autres, les événements data et end.
7par James Gaglo
8. Notez que les événements émis ont toujours un
type, qui est représenté par une chaîne. Dans
l'exemple précédent, on avait les
types d'événements "data" et "end". Ce sont des
chaînes arbitraires spécifiées par l'émetteur
d'événements, par convention, les types
d'événements sont généralement minuscules
mots sans espaces.
L'API que vous utilisez doit documenter les types
d'événements qu'il émet.
8par James Gaglo
9. Un émetteur d'événements est une interface
générique qui sert tout type d'événement, mais
il y a un cas particulier dans la mise en œuvre
dans Node, et c'est l'évènement "error". La
plupart des implémentations émetteur
d'événements dans le Node émet un
évènement "error" chaque fois qu'il ya une
erreur.
9par James Gaglo
10. Tout objet qui implémente le modèle émetteur
d'événements (comme un Socket TCP, une requête
HTTP, et beaucoup d'autres) met en œuvre un
ensemble de méthodes:
addListener et on : Pour ajouter un écouteur
d'événements à un type d'événement
once : Pour attacher un écouteur d'événement à un
type d'événement donné qui sera appelée au plus une
fois
removeEventListener: Pour supprimer un écouteur
d'événements d'un événement donné
removeAllEventListeners - Pour supprimer tous les
écouteurs d'événements d'un type d'événement donné
10par James Gaglo
11. Lier des fonctions Callbacks à l'aide de .addListener() ou
.on()
En spécifiant un type d'événement et une fonction de rappel,
vous pouvez souscrire une fonction à appeler lorsque l'un
de ces événements se produit. Par exemple, une lecture d'un
flux de fichier lecture peut émettre un événement "data"
quand un morceau de données est disponible. Voici
comment vous pouvez être informé de ce qui passe par une
fonction de rappel:
1. function receiveData(data) {
2. console.log("got data from file read stream: %j", data);
3. }
4. readStream.addListener(“data”, receiveData);
11par James Gaglo
12. Lier des fonctions Callbacks à l'aide de .addListener() ou
.on()
Au lieu d'utiliser la fonction .addListener, vous pouvez utiliser
.on, qui est simplement un raccourci. la
le code suivant est équivalent:
1. readStream.on("data", function(data) {
2. console.log("got data from file read stream: %j", data);
3. });
Dans le code précédent nous utilisons une fonction nommée
que nous avons déclarée à l'avance, mais dans celui-ci une
fonction inline anonyme est utilisée pour être plus succinct.
12par James Gaglo
13. Lier des fonctions Callbacks à l'aide de
.addListener() ou .on()
Les arguments qui sont passés à la fonction de
rappel dépendent de l'événement spécifié par l'
objet émetteur et le type d'événement et ne sont
pas normalisés. Un événement "data" pourrait
émettre des données tampons "data",
un évènement "error" pourrait émettre l'objet
"error", et le flux d'événement "end" ne pourrait
émettre aucune valeur.
13par James Gaglo
14. Lier plusieurs Listners
Le modèle émetteur d'événements permet à plusieurs
écouteurs d'événements d'écouter le même type
d'événement sur le même émetteur d'événements.
Par exemple:
1. readStream.on("data", function(data) {
2. console.log('I have some data here.');
3. });
4. readStream.on("data", function(data) {
5. console.log('I have some data here too.');
6. });
14par James Gaglo