Heim > Web-Frontend > js-Tutorial > Lassen Sie uns über das Ereignismodul in Node.js sprechen

Lassen Sie uns über das Ereignismodul in Node.js sprechen

青灯夜游
Freigeben: 2021-12-06 18:42:21
nach vorne
4693 Leute haben es durchsucht

In diesem Artikel erfahren Sie mehr über das Ereignismodul im Modul Node.js und stellen vor, was ereignisgesteuert ist, die Ereignisarchitektur von NodeJS, die Kern-API des Ereignismoduls usw. Ich hoffe, dass es hilfreich ist an alle!

Lassen Sie uns über das Ereignismodul in Node.js sprechen

Zitat der offiziellen Beschreibung: Der Großteil der Kern-API von Node.js basiert auf einer idiomatischen asynchronen ereignisgesteuerten Architektur, in der bestimmte Objekttypen (sogenannte „Trigger“) ein benanntes Ereignis auslösen, das das Funktion aufzurufendes Objekt („Listener“). Function 对象("监听器")被调用。

通过对Node的学习及应用,我们知道NodeJS其采用单线程、事件驱动、非阻塞I/O等架构设计,非常适用于高并发、I/O密集型应用。

1. 什么是事件驱动?

事件驱动,简单来说就是通过有效方法来监听事件状态的变化,并在发生变化时做出相应的动作。

举一个生活应用的场景来理解:当我们去饭店吃饭点餐,当我们下单之后,服务员告诉我们的订单号(这时候可以理解为注册了一个事件),我们在坐着等候,这时候我们的耳朵就一直监听着服务员的喊号,当喊到我们的时候,我们可以去前台取餐。

2. 事件模型

NodeJS的事件架构采用经典的--订阅发布模式

订阅发布模式,也可以称之为消息机制,定义了一种依赖关系,这种依赖关系可以理解为 1对N(多个或者单个)观察者们同时监听某一个对象相应的状态变换,一旦变化则通知到所有观察者,从而触发观察者注册的相应事件,该设计模式解决了主体对象与观察者之间功能的耦合。

3. events模块

events模块是NodeJS非常重要的一个模块,在node中大部分的模块的实现都继承了Events类,如fs,http,net等。它提供了一个对象events.EventEmitter,EventEmitter 的核心是事件发射与事件监听器。

简单使用:

import { EventEmitter } from 'events';

class MyEmiter extends EventEmitter{};

const myEmitter = new MyEmiter();

myEmitter.on('hello', () => {
  console.log('hello 有人喊你啦');
});

myEmitter.emit('hello');
Nach dem Login kopieren

4. Events模块核心API

4.1 eventEmitter.on(eventName, callback)

注册监听事件

参数:

  • eventName: 事件名称
  • callback: 事件触发被调用回调函数

4.2 eventEmitter.once(eventName, callback)

可以注册一个监听器,该监听器最多为特定事件调用一次。 一旦事件被触发,则监听器就会被注销然后被调用。

参数:

  • eventName: 事件名称
  • callback: 事件触发被调用回调函数

4.3 eventEmitter.emit(eventName[, ...args])

触发指定的监听事件

参数:

  • eventName: 事件名称
  • args可选参数,按顺序传入回调函数的参数;

4.4 eventEmitter.removeListener(eventName, callback)

移除指定事件的监听器,注意:该监听器必须是注册过的。否则无效。

参数:

  • eventName: 事件名称
  • callback: 回调函数

4.5 EventEmitter.removeAllListeners(eventName)

移除所有监听器,一个事件可以有多个监听,需要全部移除时,可以用此方法。

参数:

  • eventName: 需要全部移除的事件名称;

需要特别注意的是,如果不传参数,将会移除所有的监听事件,比较暴力,建议慎用。

4.6 EventEmitter.listeners(eventName)

返回名为 eventName 的事件的监听器绑定回调函数数组的副本。

4.7 EventEmitter.eventNames()

返回列出触发器已为其注册监听器的事件的数组。

4.8 EventEmitter.setMaxListeners(n)

默认情况下,如果为特定事件添加了 10 个以上的监听器,则 EventEmitter 将打印警告。

emitter.setMaxListeners() 方法允许修改此特定 EventEmitter 实例的限制。 该值可以设置为 Infinity(或 0)以指示无限数量的监听器。

5. 同步异步的问题

EventEmitter 按照注册的顺序同步地调用所有监听器。这确保了事件的正确排序,并有助于避免竞争条件和逻辑错误。

6.错误处理

EventEmitter 实例中发生错误时,典型的操作是触发 'error'

Durch das Studium und die Anwendung von 🎜Node🎜 wissen wir, dass NodeJS Single-Threaded-, ereignisgesteuerte, nicht blockierende E/A- und andere Architekturdesigns verwendet, die sich sehr gut für hohe Parallelität eignen /O-intensive Anwendungen. 🎜

1. Was ist ereignisgesteuert?

🎜Ereignisgesteuert bedeutet, einfach ausgedrückt, effektive Methoden zu verwenden, um Änderungen im Ereignisstatus zu überwachen und entsprechende Maßnahmen zu ergreifen, wenn Änderungen auftreten. 🎜🎜 Nehmen wir zum Verständnis ein Lebensanwendungsszenario: Wenn wir in ein Restaurant gehen, um Essen zu bestellen, teilt uns der Kellner nach der Bestellung die Bestellnummer mit (dies kann als Registrierung eines Ereignisses verstanden werden), und wir sitzen und Unsere Ohren haben auf den Ruf des Kellners gehört. Wenn wir gerufen werden, können wir zur Rezeption gehen, um unsere Mahlzeiten zu holen. 🎜

2. Ereignismodell

🎜Die Ereignisarchitektur von NodeJS übernimmt das klassische Abonnement-Veröffentlichungsmodell🎜🎜Das Abonnement-Veröffentlichungsmodell, das auch als Nachrichtenmechanismus bezeichnet werden kann, definiert eine Abhängigkeitsbeziehung Dies kann als ein Paar von N (mehreren oder einzelnen) Beobachtern verstanden werden, die den entsprechenden Zustandsübergang eines Objekts gleichzeitig überwachen. Sobald eine Änderung auftritt, werden alle Beobachter benachrichtigt, wodurch das entsprechende vom Beobachter registrierte Ereignis ausgelöst wird das Problem des Hauptobjekts. 🎜

3. Events-Modul

🎜Das Events-Modul ist ein sehr wichtiges Modul von NodeJS. Die Implementierung der meisten Module in Node erbt die Events-Klasse, wie z. B. fs, http, net usw. Es stellt ein Objekt events.EventEmitter bereit. Der Kern von EventEmitter ist die Ereignisemission und der Ereignis-Listener. 🎜🎜Einfach zu verwenden: 🎜
import { EventEmitter } from 'events';

class MyEmiter extends EventEmitter{};

const myEmitter = new MyEmiter();

myEmitter.on('hello', () => {
  console.log('hello 有人喊你啦');
});

myEmitter.on('error', (e) => {
  console.log(e)
})

myEmitter.emit('hello');
myEmitter.emit('error', new Error('an error happen'))
Nach dem Login kopieren
Nach dem Login kopieren

4. Kern-API des Ereignismoduls

🎜4.1 eventEmitter.on(eventName, callback)🎜🎜Registrieren Sie sich, um zuzuhören für Ereignisse🎜 🎜Parameter:🎜
  • eventName: Ereignisname
  • callback: Rückruffunktion, die aufgerufen wird, wenn das Ereignis ausgelöst wird
🎜4.2 eventEmitter.once(eventName , callback)🎜🎜Sie können einen Listener registrieren, der höchstens einmal für ein bestimmtes Ereignis aufgerufen wird. Sobald das Ereignis ausgelöst wird, wird der Listener abgemeldet und dann aufgerufen. 🎜🎜Parameter: 🎜
  • eventName: Ereignisname
  • callback: Rückruffunktion, die aufgerufen wird, wenn das Ereignis ausgelöst wird
🎜4.3 eventEmitter. emit( ​​eventName[, ...args])🎜🎜Lösen Sie das angegebene Abhörereignis aus🎜🎜Parameter:🎜
  • eventName: Ereignisname
  • args optional Parameter, übergeben Sie die Parameter der Rückruffunktion der Reihe nach;
🎜4.4 eventEmitter.removeListener(eventName, callback)🎜🎜Entfernen Sie den Listener Beachten Sie für den angegebenen Ereignis-Listener: Der Listener muss registriert sein. Andernfalls ist es ungültig. 🎜🎜Parameter: 🎜
  • eventName: Ereignisname
  • callback: Rückruffunktion
🎜4.5 EventEmitter.removeAllListeners(eventName)</ li> code></strong>🎜🎜Alle Listener entfernen. Wenn Sie alle Listener entfernen müssen, können Sie diese Methode verwenden. 🎜🎜Parameter: 🎜<ul><li>eventName: der Name aller Ereignisse, die entfernt werden müssen </li></ul>🎜<code>Es ist wichtig zu beachten, dass alle Ereignisse, wenn keine Parameter übergeben werden wird entfernt Überwachungsereignisse sind relativ heftig, daher wird empfohlen, sie mit Vorsicht zu verwenden. 🎜🎜4.6 EventEmitter.listeners(eventName)🎜🎜Gibt das Listener-Bindungs-Callback-Funktionsarray für das Ereignis mit dem Namen eventName zurück . 🎜🎜4.7 EventEmitter.eventNames()🎜🎜Gibt ein Array zurück, das die Ereignisse auflistet, für die der Trigger registrierte Listener hat. 🎜🎜4.8 EventEmitter.setMaxListeners(n)🎜🎜Wenn standardmäßig mehr als 10 Listener für ein bestimmtes Ereignis hinzugefügt werden, dann EventEmitter gibt eine Warnung aus. Mit der Methode 🎜🎜emitter.setMaxListeners() können Sie die Grenzwerte dieser spezifischen EventEmitter-Instanz ändern. Der Wert kann auf Infinity (oder 0) gesetzt werden, um eine unbegrenzte Anzahl von Listenern anzugeben. 🎜

5. Synchronisierungs- und asynchrone Probleme

🎜EventEmitter ruft alle Listener synchron in der Reihenfolge der Registrierung auf. Dies stellt die korrekte Reihenfolge der Ereignisse sicher und hilft, Race Conditions und Logikfehler zu vermeiden. 🎜

6. Fehlerbehandlung

🎜Wenn ein Fehler in der EventEmitter-Instanz auftritt, besteht die typische Operation darin, 'error'</ auszulösen. Code> Ereignis. Diese werden in Node.js als Sonderfälle behandelt. 🎜<p>如果 <code>EventEmitter 没有为 &#39;error&#39; 事件注册至少一个监听器,并且触发 &#39;error&#39; 事件,则会抛出错误,打印堆栈跟踪,然后退出 Node.js 进程。

作为最佳实践,应始终为 &#39;error&#39; 事件添加监听器。

import { EventEmitter } from &#39;events&#39;;

class MyEmiter extends EventEmitter{};

const myEmitter = new MyEmiter();

myEmitter.on(&#39;hello&#39;, () => {
  console.log(&#39;hello 有人喊你啦&#39;);
});

myEmitter.on(&#39;error&#39;, (e) => {
  console.log(e)
})

myEmitter.emit(&#39;hello&#39;);
myEmitter.emit(&#39;error&#39;, new Error(&#39;an error happen&#39;))
Nach dem Login kopieren
Nach dem Login kopieren

更多node相关知识,请访问:nodejs 教程!!

Das obige ist der detaillierte Inhalt vonLassen Sie uns über das Ereignismodul in Node.js sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage