Maison interface Web js tutoriel Explication détaillée des exemples d'utilisation de l'écoute d'événements et de la publication d'événements dans Node.js

Explication détaillée des exemples d'utilisation de l'écoute d'événements et de la publication d'événements dans Node.js

Jul 24, 2017 am 10:29 AM
javascript node.js 监听

node.js est basé sur des E/S asynchrones non bloquantes à thread unique, ce qui signifie que lorsqu'il rencontre une opération d'E/S, le thread ne bloque pas mais effectue les opérations suivantes. une fois l'opération d'E/S terminée, comment le thread sait-il que l'opération est terminée ?

Lorsque l'opération termine l'opération d'E/S fastidieuse, le thread de l'opération d'E/S sera notifié sous la forme d'un événement. Le thread traitera cet événement à un moment précis. et passez à l'étape suivante. Afin d'effectuer des E/S asynchrones, le thread doit disposer d'un mécanisme de boucle d'événements, insistant constamment sur la présence d'événements inachevés et complétant le traitement de ces événements dans l'ordre.

Pour bloquer les E/S, lorsqu'un thread rencontre une opération d'E/S fastidieuse, il arrêtera de s'exécuter et attendra la fin de l'opération. À ce stade, le thread ne peut pas accepter d'autres demandes d'opération. Afin de fournir un débit, plusieurs threads doivent être créés, chaque thread pour répondre à la demande d'un client, mais en même temps, un seul thread peut s'exécuter sur un cœur de processeur. Si plusieurs threads veulent s'exécuter, ils doivent basculer entre différents threads.

Par conséquent, node.js réduit le coût de création de threads et de changement de thread dans les multi-threads. Le coût du changement de thread est très élevé. Il doit lui allouer de la mémoire et l'inclure dans le planning. en même temps, lors du changement de thread. Parfois, il est nécessaire d'effectuer une pagination de la mémoire et d'autres opérations. Ces opérations peuvent être réduites en utilisant un seul thread. Cependant, cette méthode de programmation présente également des inconvénients et n'est pas conforme au design thinking des gens.

node.js est basé sur le mode événement pour implémenter des E/S asynchrones. Lorsqu'il est démarré, il déterminera en continu s'il y a des événements inachevés, puis l'exécutera une fois l'exécution terminée, un autre événement. sera Notifier le thread sous la forme de Les tâches sont divisées en petits événements, et node.js convient également à la gestion de certains scénarios d'E/S élevées et de logique faible.

L'exemple suivant illustre la lecture de fichiers asynchrone :


var fs = require('fs'); 
fs.readFile('file.txt', 'utf-8', function(err, data) { 
if (err) { 
<span style="white-space:pre"> </span>console.error(err); 
} else { 
<span style="white-space:pre"> </span>console.log(data); 
} 
}); 
[javascript] view plain copy
console.log("end");
Copier après la connexion

Comme ci-dessusfs.readFile Lire le fichier de manière asynchrone, puis le processus continuera sans attendre la fin de la lecture du fichier. Lorsque le fichier est lu, un événement sera libéré et le thread d'exécution exécutera l'opération correspondante lorsqu'il traversera l'événement. la fonction de rappel correspondante Dans l'exemple, la fin de la chaîne sera imprimée avant le contenu du fichier.

API d'événement node.js

events.EventEmitter : EventEmitter fournit l'encapsulation des fonctions d'émission et d'écoute d'événements dans node.js, chaque événement se compose d'une chaîne identifiant le nom de l'événement et l'opération correspondante.

Suivi des événements :


var events = require("events"); 
var emitter = new events.EventEmitter(); 
 <span style="font-family: Arial, Helvetica, sans-serif;">emitter.on("eventName", function(){</span> 
  console.log("eventName事件发生") 
})
Copier après la connexion

Publication des événements :


emitter.emit("eventName");
Copier après la connexion

Lors de la publication d'un événement, nous pouvons transmettre plusieurs paramètres. Le premier paramètre représente le nom de l'événement et les paramètres suivants représentent les paramètres transmis. Ces paramètres seront transmis. dans la fonction de rappel d'événement.

EventEmitter.once("eventName", listener)  : Enregistrez un écouteur pour un événement qui n'est exécuté qu'une seule fois. Lorsque l'événement se produit pour la première fois et que l'écouteur est déclenché, l'écouteur sera libéré si l'événement se produit par la suite. , l'écouteur sera libéré. ​​Le serveur ne s'exécutera pas.

EventEmitter.removeListener(event, listener)  : Supprimer l'écouteur d'événement

EventEmitter.removeAllListeners(event) : Supprimer tous les écouteurs d'événement

EventEmitter.setMaxListeners(n) : Le maximum par défaut le nombre d'écouteurs pour un seul événement dans node.js est de 10. S'il dépasse 10, un avertissement sera émis afin d'éviter un débordement de mémoire. Nous pouvons modifier cette limite par d'autres nombres. Si elle est définie, une valeur de 0 signifie aucune restriction. .

EventEmitter.listeners(event)  : Renvoie la liste des auditeurs d'un événement

La collaboration entre plusieurs événements
est légèrement plus grande Dans certains applications, la séparation entre les données et les serveurs Web est inévitable, comme Sina Weibo, Facebook, Twitter, etc. L'avantage est que les sources de données sont unifiées et que divers programmes clients riches peuvent être développés pour les mêmes sources de données.

Prenons l'exemple des applications Web. Lors du rendu d'une page, il est généralement nécessaire d'extraire des données de plusieurs sources de données et enfin de les restituer au client. Dans ce scénario, Node.js peut naturellement et facilement lancer des requêtes vers plusieurs sources de données en parallèle en même temps.


api.getUser("username", function (profile) {
 // Got the profile
});
api.getTimeline("username", function (timeline) {
 // Got the timeline
});
api.getSkin("username", function (skin) {
 // Got the skin
});
Copier après la connexion

Node.js utilise un mécanisme asynchrone pour rendre les requêtes non bloquantes, atteindre l'objectif des requêtes parallèles et appeler efficacement les ressources sous-jacentes. Cependant, le problème dans ce scénario est que la coordination de plusieurs résultats de réponses à des événements n'est pas prise en charge de manière élégante et native par Node.js.

Afin d'obtenir des résultats pour les trois demandes avant de passer à l'étape suivante, le programme peut être modifié dans la situation suivante :


api.getUser("username", function (profile) {
 api.getTimeline("username", function (timeline) {
  api.getSkin("username", function (skin) {
   // TODO
  });
 });
});
Copier après la connexion

Cela entraînera des requêtes effectuées en série et ne pourra pas maximiser l'utilisation du serveur API sous-jacent.

为解决这类问题,我曾写作一个模块来实现多事件协作,以下为上面代码的改进版:


var proxy = new EventProxy();
proxy.all("profile", "timeline", "skin", function (profile, timeline, skin) {
 // TODO
});
api.getUser("username", function (profile) {
 proxy.emit("profile", profile);
});
api.getTimeline("username", function (timeline) {
 proxy.emit("timeline", timeline);
});
api.getSkin("username", function (skin) {
 proxy.emit("skin", skin);
});
Copier après la connexion

EventProxy也是一个简单的事件侦听者模式的实现,由于底层实现跟Node.js的EventEmitter不同,无法合并进Node.js中。但是却提供了比EventEmitter更强大的功能,且API保持与EventEmitter一致,与Node.js的思路保持契合,并可以适用在前端中。
这里的all方法是指侦听完profile、timeline、skin三个方法后,执行回调函数,并将侦听接收到的数据传入。

利用事件队列解决雪崩问题

所谓雪崩问题,是在缓存失效的情景下,大并发高访问量同时涌入数据库中查询,数据库无法同时承受如此大的查询请求,进而往前影响到网站整体响应缓慢。

那么在Node.js中如何应付这种情景呢。


var select = function (callback) {
  db.select("SQL", function (results) {
   callback(results);
  });
 };
Copier après la connexion

以上是一句数据库查询的调用,如果站点刚好启动,这时候缓存中是不存在数据的,而如果访问量巨大,同一句SQL会被发送到数据库中反复查询,影响到服务的整体性能。一个改进是添加一个状态锁。


var status = "ready";
var select = function (callback) {
  if (status === "ready") {
   status = "pending";
   db.select("SQL", function (results) {
    callback(results);
    status = "ready";
   });
  }
 };
Copier après la connexion

但是这种情景,连续的多次调用select发,只有第一次调用是生效的,后续的select是没有数据服务的。所以这个时候引入事件队列吧:


var proxy = new EventProxy();
var status = "ready";
var select = function (callback) {
  proxy.once("selected", callback);
  if (status === "ready") {
   status = "pending";
   db.select("SQL", function (results) {
    proxy.emit("selected", results);
    status = "ready";
   });
  }
 };
Copier après la connexion

这里利用了EventProxy对象的once方法,将所有请求的回调都压入事件队列中,并利用其执行一次就会将监视器移除的特点,保证每一个回调只会被执行一次。对于相同的SQL语句,保证在同一个查询开始到结束的时间中永远只有一次,在这查询期间到来的调用,只需在队列中等待数据就绪即可,节省了重复的数据库调用开销。由于Node.js单线程执行的原因,此处无需担心状态问题。这种方式其实也可以应用到其他远程调用的场景中,即使外部没有缓存策略,也能有效节省重复开销。此处也可以用EventEmitter替代EventProxy,不过可能存在侦听器过多,引发警告,需要调用setMaxListeners(0)移除掉警告,或者设更大的警告阀值。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Dec 17, 2023 pm 12:09 PM

Introduction à l'utilisation de JavaScript et de WebSocket pour mettre en œuvre un système de commande en ligne en temps réel : avec la popularité d'Internet et les progrès de la technologie, de plus en plus de restaurants ont commencé à proposer des services de commande en ligne. Afin de mettre en œuvre un système de commande en ligne en temps réel, nous pouvons utiliser les technologies JavaScript et WebSocket. WebSocket est un protocole de communication full-duplex basé sur le protocole TCP, qui peut réaliser une communication bidirectionnelle en temps réel entre le client et le serveur. Dans le système de commande en ligne en temps réel, lorsque l'utilisateur sélectionne des plats et passe une commande

Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 am 09:39 AM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de réservation en ligne. À l'ère numérique d'aujourd'hui, de plus en plus d'entreprises et de services doivent fournir des fonctions de réservation en ligne. Il est crucial de mettre en place un système de réservation en ligne efficace et en temps réel. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de réservation en ligne et fournit des exemples de code spécifiques. 1. Qu'est-ce que WebSocket ? WebSocket est une méthode full-duplex sur une seule connexion TCP.

Surveiller le comportement de défilement des iframes Surveiller le comportement de défilement des iframes Feb 18, 2024 pm 08:40 PM

Comment surveiller le défilement d'une iframe nécessite des exemples de code spécifiques Lorsque nous utilisons la balise iframe pour intégrer d'autres pages Web dans une page Web, nous devons parfois effectuer certaines opérations spécifiques sur le contenu de l'iframe. L'un des besoins courants est d'écouter l'événement de défilement de l'iframe afin que le code correspondant puisse être exécuté lorsque le défilement se produit. Ce qui suit explique comment utiliser JavaScript pour surveiller le défilement d'une iframe et fournit des exemples de code spécifiques à titre de référence. Récupérer l'élément iframe Tout d'abord, nous avons besoin

JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel Dec 17, 2023 pm 05:13 PM

JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Comment utiliser insertBefore en javascript Comment utiliser insertBefore en javascript Nov 24, 2023 am 11:56 AM

Utilisation : En JavaScript, la méthode insertBefore() est utilisée pour insérer un nouveau nœud dans l'arborescence DOM. Cette méthode nécessite deux paramètres : le nouveau nœud à insérer et le nœud de référence (c'est-à-dire le nœud où le nouveau nœud sera inséré).

See all articles