Node.js - Boucle d'événements
Node.js est une application monothread, mais elle peut prendre en charge la concurrence via le concept de event et callbacks. Chaque API de Node.js est asynchrone et mono-thread, ils utilisentasync function callspour maintenir la concurrence. Node utilise un modèle d'observateur. Le thread de nœud garde une boucle d'événements et chaque fois qu'une tâche est terminée, il déclenche l'événement correspondant qui signale à la fonction d'écoute d'événements de s'exécuter.
Programmation événementielle
Node.js utilise énormément les événements et c'est aussi l'une des raisons pour lesquelles Node.js est assez rapide par rapport à d'autres technologies similaires. Dès que Node démarre son serveur, il lance simplement ses variables, déclare des fonctions puis attend simplement que l'événement se produise.
Dans une application événementielle, il existe généralement une boucle principale qui écoute les événements, puis déclenche une fonction de rappel lorsqu'un de ces événements est détecté.
Bien que les événements ressemblent assez aux rappels, la différence réside dans le fait que les fonctions de rappel sont appelées lorsqu'une fonction asynchrone renvoie son résultat, alors que la gestion des événements fonctionne sur le modèle d'observateur. Les fonctions qui écoutent les événements agissent commeObservers. Chaque fois qu'un événement est déclenché, sa fonction d'écoute commence à s'exécuter. Node.js a plusieurs événements intégrés disponibles via le module d'événements et la classe EventEmitter qui sont utilisés pour lier des événements et des écouteurs d'événements comme suit -
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
Voici la syntaxe pour lier un gestionnaire d'événements à un événement -
// Bind event and event handler as follows
eventEmitter.on('eventName', eventHandler);
Nous pouvons déclencher un événement par programmation comme suit -
// Fire an event
eventEmitter.emit('eventName');
Exemple
Créez un fichier js nommé main.js avec le code suivant -
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
// Create an event handler as follows
var connectHandler = function connected() {
console.log('connection succesful.');
// Fire the data_received event
eventEmitter.emit('data_received');
}
// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function() {
console.log('data received succesfully.');
});
// Fire the connection event
eventEmitter.emit('connection');
console.log("Program Ended.");
Essayons maintenant d'exécuter le programme ci-dessus et de vérifier sa sortie -
$ node main.js
IL devrait produire le résultat suivant -
connection successful.
data received successfully.
Program Ended.
Comment fonctionnent les applications de nœud?
Dans Node Application, toute fonction asynchrone accepte un rappel comme dernier paramètre et une fonction de rappel accepte une erreur comme premier paramètre. Revenons à nouveau à l'exemple précédent. Créez un fichier texte nommé input.txt avec le contenu suivant.
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
Créez un fichier js nommé main.js ayant le code suivant -
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) {
console.log(err.stack);
return;
}
console.log(data.toString());
});
console.log("Program Ended");
Ici, fs.readFile () est une fonction asynchrone dont le but est de lire un fichier. Si une erreur se produit pendant l'opération de lecture, leerr object contiendra l'erreur correspondante, sinon les données contiendront le contenu du fichier. readFile transmet err et data à la fonction de rappel une fois l'opération de lecture terminée, qui imprime finalement le contenu.
Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!