15
Par Jame Gaglo

Programmation evénementielle

Embed Size (px)

Citation preview

Page 1: Programmation evénementielle

Par Jame Gaglo

Page 2: Programmation evénementielle

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.

2 par James Gaglo

Page 3: Programmation evénementielle

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());

});

3 par James Gaglo

Page 4: Programmation evénementielle

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.

4 par James Gaglo

Page 5: Programmation evénementielle

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:

5 par James Gaglo

Page 6: Programmation evénementielle

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();

6 par James Gaglo

Page 7: Programmation evénementielle

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.

7 par James Gaglo

Page 8: Programmation evénementielle

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.

8 par James Gaglo

Page 9: Programmation evénementielle

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.

9 par James Gaglo

Page 10: Programmation evénementielle

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é

10 par James Gaglo

Page 11: Programmation evénementielle

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);

11 par James Gaglo

Page 12: Programmation evénementielle

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.

12 par James Gaglo

Page 13: Programmation evénementielle

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.

13 par James Gaglo

Page 14: Programmation evénementielle

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. });

14 par James Gaglo

Page 15: Programmation evénementielle

Professional Nodejs de Pedro Teixeira

par James Gaglo 15