Boucle d'événements Node.js


Boucle d'événements Node.js

Node.js est une application à processus unique et à thread unique, mais prend en charge la concurrence via des événements et des rappels, ses performances sont donc très élevées.

Chaque API de Node.js est asynchrone et s'exécute comme un thread distinct, utilise des appels de fonction asynchrones et gère la concurrence.

Fondamentalement, tous les mécanismes d'événements dans Node.js sont implémentés à l'aide du modèle d'observateur dans le modèle de conception.

Le thread unique Node.js est similaire à l'entrée d'une boucle d'événement while(true) jusqu'à ce qu'aucun observateur d'événement ne se termine. Chaque événement asynchrone génère un observateur d'événement. Si un événement se produit, la fonction de rappel est appelée.


Programme basé sur les événements

Node.js utilise un modèle basé sur les événements Lorsque le serveur Web reçoit une requête, il la ferme et la traite, puis sert la requête Web suivante.

Lorsque cette requête est complétée, elle est remise dans la file d'attente de traitement, et lorsque le début de la file d'attente est atteint, le résultat est renvoyé à l'utilisateur.

Ce modèle est très efficace et évolutif car le serveur Web accepte toujours les requêtes sans attendre aucune opération de lecture ou d'écriture. (Cela est également appelé IO non bloquant ou IO piloté par événement)

Dans le modèle piloté par événement, une boucle principale est générée pour écouter les événements, et une fonction de rappel est déclenchée lorsqu'un événement est détecté.


C'est ainsi que l'ensemble du processus événementiel est mis en œuvre, ce qui est très simple. Un peu similaire au modèle d'observateur, l'événement est équivalent à un sujet (Sujet) et toutes les fonctions de gestionnaire enregistrées pour cet événement sont équivalentes à des observateurs (Observateur).

Node.js a plusieurs événements intégrés. Nous pouvons lier et écouter des événements en introduisant le module d'événements et en instanciant la classe EventEmitter, comme le montre l'exemple suivant :

// 引入 events 模块var events = require('events');// 创建 eventEmitter 对象var eventEmitter = new events.EventEmitter();

Ce qui suit. le programme lie Gestionnaire d'événements :

// 绑定事件及事件的处理程序eventEmitter.on('eventName', eventHandler);

Nous pouvons déclencher des événements via le programme :

// 触发事件eventEmitter.emit('eventName');

Instance

Créez le fichier main.js, le code est le suivant :
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 创建事件处理程序
var connectHandler = function connected() {
   console.log('连接成功。');
  
   // 触发 data_received 事件 
   eventEmitter.emit('data_received');
}

// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
 
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('数据接收成功。');
});

// 触发 connection 事件 
eventEmitter.emit('connection');

console.log("程序执行完毕。");

Laissez ensuite exécutons le code ci-dessus :

$ node main.js
连接成功。
数据接收成功。
程序执行完毕。


Comment fonctionne l'application Node ?

Dans les applications Node, les fonctions qui effectuent des opérations asynchrones prennent une fonction de rappel comme dernier paramètre, La fonction de rappel reçoit l'objet d'erreur comme premier paramètre.

Ensuite, reprenons l'exemple précédent et créons un input.txt avec le contenu suivant :

菜鸟教程官网地址:www.runoob.com

Créons le fichier main.js avec 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("程序执行完毕");

Dans le programme ci-dessus, fs.readFile() est une fonction asynchrone utilisée pour lire des fichiers. Si une erreur se produit lors de la lecture du fichier, l'objet error err affichera des informations sur l'erreur.

Si aucune erreur ne se produit, readFile ignore la sortie de l'objet err et le contenu du fichier est affiché via la fonction de rappel.

Exécutez le code ci-dessus, le résultat de l'exécution est le suivant :

程序执行完毕
php中文网官网地址:www.php.cn

Ensuite, nous supprimons le fichier input.txt, le résultat de l'exécution est le suivant :

程序执行完毕
Error: ENOENT, open 'input.txt'

Parce que le le fichier input.txt n'existe pas, donc un message d'erreur est généré.