Inhaltsverzeichnis
事件的监听和发射
移除事件监听
其它一些方法
Ereignisüberwachung und -emission
Ereignis-Listener entfernen
Einige andere Methoden
Heim Web-Frontend js-Tutorial Eine kurze Analyse des Ereignismoduls von Node

Eine kurze Analyse des Ereignismoduls von Node

Feb 20, 2023 pm 07:33 PM
nodejs node

Eine kurze Analyse des Ereignismoduls von Node

In Vue-Projekten verwenden wir manchmal den globalen Event-Bus, um die Kommunikation zwischen Komponenten zu verwalten. Im vue2-Projekt können wir $emit, $on und $off verwenden, um einen eventHub einzukapseln vue3$on und $off entfernt werden, können wir die Mitt-Bibliothek oder die Tiny-Emitter-Bibliothek verwenden. In Node ist kein so großer Aufwand erforderlich. Es verfügt über ein integriertes Ereignismodul, das uns bei der Überwachung und Ausgabe von Ereignissen helfen kann. $emit$on$off 封装一个 eventHub;vue3 中 $on$off 被移除了,我们可以使用 mitt 库或 tiny-emitter 库。在 node 里,则不用这么麻烦,其有个内置的 events 模块就可以帮我们实现对于事件的监听和发射。

事件的监听和发射

先使用 CommonJS 的语法导入得到 EventEmitter 类,然后生成实例 emitterEventEmitter 十分重要,比如后续文章会介绍的 stream 就是 EventEmitter 的实例):

const EventEmitter = require('events')
const emitter = new EventEmitter()
Nach dem Login kopieren

接着就可以使用 emitter.on() 对事件进行监听,传入的第 1 个参数就是事件名称,第 2 个参数为监听到事件被发射后要执行的回调,如果发射事件时有传入参数,会传递给回调函数,可以一个个单独获取,也可以像下面这样使用函数的剩余参数获取: 【相关教程推荐:nodejs视频教程编程教学

// 监听事件
emitter.on('test', (...args) => {
  console.log(args) // [ 1, 2, 3 ]
})
// 发射事件
emitter.emit('test', 1, 2, 3)
Nach dem Login kopieren

如果只需要监听一次性事件,可以使用 emitter.once()

emitter.once('test', () => {
  console.log('监听到了事件发射')
})

emitter.emit('test')
emitter.emit('test') // 本次发射不会触发打印
Nach dem Login kopieren

如果有多个地方如下例所示对事件进行了监听,一旦事件发射,那么监听回调会按顺序依次触发:

emitter.on('test', () => {
  console.log('监听到了事件发射,1')
})
emitter.on('test', () => {
  console.log('监听到了事件发射,2')
})
emitter.emit('test')
Nach dem Login kopieren

执行结果:

Eine kurze Analyse des Ereignismoduls von Node

如果想把监听事件添加到最前面,可以使用 emitter.prependListener()(或者 emitter.prependOnceListener(),即提前但只监听一次):

emitter.on('test', () => {
  console.log('监听到了事件发射,1')
})
emitter.prependListener('test', () => {
  console.log('监听到了事件发射,2')
})

emitter.emit('test')
Nach dem Login kopieren

现在的结果如下:

Eine kurze Analyse des Ereignismoduls von Node

移除事件监听

可以使用 emitter.off()(或者 emitter.removeListener())移除对事件的监听,但需要传入对应的事件名称和回调函数,所以我们在监听时的回调就不能直接像上面这样定义在 emitter.on() 内部了,需要在外部定义然后传入对该回调的引用:

function handler(...args) {
  console.log(args) // [ 1, 2, 3 ]
}
emitter.on('test', handler)
emitter.emit('test', 1, 2, 3) 
emitter.off('test', handler)
emitter.emit('test', '无法被监听到')
Nach dem Login kopieren

emitter.off()只能移除一个监听,且必须传入监听回调,如果有多次监听,想全部移除,可以使用 emitter.removeAllListeners()

emitter.on('test', handler)
emitter.on('test', handler)
emitter.on('test', handler)

emitter.removeAllListeners()
Nach dem Login kopieren

emitter.removeAllListeners()如果不传入任何参数,则移除所有事件名称的所有事件监听。其还可以传入事件名称,则移除对应事件名称的所有事件监听。

其它一些方法

监听器数量限制

1 个 EventEmitter 对象上,某个事件名称的最大监听器数量默认为 10,这可以通过 emitter.getMaxListeners() 来验证:

console.log(emitter.getMaxListeners()) // 10
Nach dem Login kopieren

比如写了 11 次 emitter.on('test', handler),就会报错,提示说要用 emitter.setMaxListeners() 来增加最大限制数量:

Eine kurze Analyse des Ereignismoduls von Node

如果我们想知道当前 EventEmitter 对象上某个事件名称的监听器有多少个,有没有超过最大限制,可以使用 emitter.listenerCount() 传入事件名称查看:

console.log(emitter.listenerCount('test'))
Nach dem Login kopieren

获取事件名称和监听器

使用 emitter.eventNames() 可以获取当前 EventEmitter 对象上注册的所有事件名称,返回的是由事件字符串组成的数组:

emitter.on('test1', handler)
emitter.on('test2', handler)

console.log(emitter.eventNames()) // [ 'test1', 'test2' ]
Nach dem Login kopieren

如果想获取某个事件对应的所有监听器,可以使用 emitter.listeners()

Ereignisüberwachung und -emission

Verwenden Sie zunächst die CommonJS-Syntax, um die Klasse EventEmitter zu importieren, und generieren Sie dann eine Instanz emitter ( EventEmitter ist sehr wichtig. Beispielsweise ist der stream, der in nachfolgenden Artikeln vorgestellt wird, eine Instanz von EventEmitter):

function handler1() {}
function handler2() {}
emitter.on('test', handler1)
emitter.on('test', handler2)

console.log(emitter.listeners('test'))
Nach dem Login kopieren
Dann Sie können emitter() verwenden, um das Ereignis zu überwachen, und der zweite Parameter ist der Rückruf, der nach der Überwachung des Ereignisses ausgeführt werden soll Wenn das Ereignis gestartet wird, wird es übergeben. Für Rückruffunktionen können Sie sie einzeln abrufen oder wie folgt verwendenDie verbleibenden Parameter der Funktion

Get: [Empfohlene verwandte Tutorials: nodejs-Video-TutorialEine kurze Analyse des Ereignismoduls von Node, Programmierunterricht

rrreeeWenn Sie nur einmalige Ereignisse abhören müssen, können Sie emitter.once() verwenden: rrreee

Wenn mehrere Orte Ereignisse überwachen, wie im Beispiel unten gezeigt, einmal das Ereignis ausgegeben wird, werden die Abhörrückrufe in der folgenden Reihenfolge ausgelöst: 🎜rrreee🎜Ausführungsergebnis: 🎜🎜 Eine kurze Analyse des Ereignismoduls von Node🎜🎜Wenn Sie Abhörereignisse im Vordergrund hinzufügen möchten, können Sie emitter.prependListener() (oder emitter. prependOnceListener(), das im Voraus, aber nur einmal, lauscht): 🎜rrreee🎜Das aktuelle Ergebnis wie folgt: 🎜🎜Eine kurze Analyse des Ereignismoduls von Node🎜

Ereignis-Listener entfernen

🎜Kann mit emitter entfernt werden .off() (oder emitter.removeListener()) Um Ereignisse zu überwachen, müssen Sie den entsprechenden Ereignisnamen und die Rückruffunktion übergeben, sodass der Rückruf beim Abhören nicht direkt definiert werden kann Innerhalb von emitter.on() wie oben muss es extern definiert werden und dann einen Verweis auf den Rückruf übergeben: 🎜rrreee🎜emitter.off() kann nur entfernen Ein Listener und der Listener-Rückruf müssen übergeben werden. Wenn mehrere Listener vorhanden sind und Sie alle entfernen möchten, können Sie emitter.removeAllListeners() verwenden: 🎜rrreee🎜emitter.removeAllListeners () Wenn keine Parameter übergeben werden, werden alle Ereignis-Listener für alle Ereignisnamen entfernt. Es kann auch der Ereignisname übergeben werden, und alle Ereignis-Listener, die dem Ereignisnamen entsprechen, werden entfernt. 🎜

Einige andere Methoden

🎜Begrenzung der Anzahl der Zuhörer🎜 🎜1 Bei einem EventEmitter-Objekt beträgt die maximale Anzahl von Listenern für einen bestimmten Ereignisnamen standardmäßig 10. Dies kann mit emitter.getMaxListeners() überprüft werden: 🎜rrreee🎜Zum Beispiel habe ich 11 Mal geschrieben emitter.on ('test', handler) wird ein Fehler gemeldet, der Sie dazu auffordert, emitter.setMaxListeners() zu verwenden, um das maximale Limit zu erhöhen: 🎜🎜Eine kurze Analyse des Ereignismoduls von Node🎜🎜Wenn wir es wissen wollen der Name eines Ereignisses auf dem aktuellen EventEmitter-Objekt. Wie viele Listener gibt es und ob sie das maximale Limit überschreiten? Sie können emitter.listenerCount() verwenden, um den Namen des eingehenden Ereignisses zu überprüfen: 🎜rrreee🎜Ereignisnamen und Listener abrufen🎜🎜Verwenden Sie emitter.eventNames(), um alle registrierten Ereignisnamen abzurufen aktuelles EventEmitter-Objekt und die zurückgegebene Ereigniszeichenfolge besteht aus Array: 🎜rrreee🎜Wenn Sie alle einem Ereignis entsprechenden Listener erhalten möchten, können Sie emitter.listeners() verwenden und das Ereignis übergeben Name: 🎜rrreee🎜Das Ergebnis ist wie folgt: 🎜🎜🎜🎜 🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial🎜! 🎜

Das obige ist der detaillierte Inhalt vonEine kurze Analyse des Ereignismoduls von Node. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Der Unterschied zwischen NodeJS und Tomcat Der Unterschied zwischen NodeJS und Tomcat Apr 21, 2024 am 04:16 AM

Die Hauptunterschiede zwischen Node.js und Tomcat sind: Laufzeit: Node.js basiert auf der JavaScript-Laufzeit, während Tomcat ein Java-Servlet-Container ist. E/A-Modell: Node.js verwendet ein asynchrones, nicht blockierendes Modell, während Tomcat synchrones Blockieren verwendet. Parallelitätsbehandlung: Node.js verarbeitet die Parallelität über eine Ereignisschleife, während Tomcat einen Thread-Pool verwendet. Anwendungsszenarien: Node.js eignet sich für Echtzeit-, datenintensive und Anwendungen mit hoher Parallelität, und Tomcat eignet sich für herkömmliche Java-Webanwendungen.

Der Unterschied zwischen NodeJS und VueJS Der Unterschied zwischen NodeJS und VueJS Apr 21, 2024 am 04:17 AM

Node.js ist eine serverseitige JavaScript-Laufzeitumgebung, während Vue.js ein clientseitiges JavaScript-Framework zum Erstellen interaktiver Benutzeroberflächen ist. Node.js wird für die serverseitige Entwicklung verwendet, beispielsweise für die Entwicklung von Back-End-Service-APIs und die Datenverarbeitung, während Vue.js für die clientseitige Entwicklung verwendet wird, beispielsweise für Single-Page-Anwendungen und reaktionsfähige Benutzeroberflächen.

Ist NodeJS ein Backend-Framework? Ist NodeJS ein Backend-Framework? Apr 21, 2024 am 05:09 AM

Node.js kann als Backend-Framework verwendet werden, da es Funktionen wie hohe Leistung, Skalierbarkeit, plattformübergreifende Unterstützung, ein umfangreiches Ökosystem und einfache Entwicklung bietet.

Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs? Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs? Apr 21, 2024 am 05:18 AM

Es gibt zwei npm-bezogene Dateien im Node.js-Installationsverzeichnis: npm und npm.cmd. Die Unterschiede sind wie folgt: unterschiedliche Erweiterungen: npm ist eine ausführbare Datei und npm.cmd ist eine Befehlsfensterverknüpfung. Windows-Benutzer: npm.cmd kann über die Eingabeaufforderung verwendet werden, npm kann nur über die Befehlszeile ausgeführt werden. Kompatibilität: npm.cmd ist spezifisch für Windows-Systeme, npm ist plattformübergreifend verfügbar. Nutzungsempfehlungen: Windows-Benutzer verwenden npm.cmd, andere Betriebssysteme verwenden npm.

Ist NodeJS eine Back-End-Entwicklungssprache? Ist NodeJS eine Back-End-Entwicklungssprache? Apr 21, 2024 am 05:09 AM

Ja, Node.js ist eine Backend-Entwicklungssprache. Es wird für die Back-End-Entwicklung verwendet, einschließlich der Handhabung serverseitiger Geschäftslogik, der Verwaltung von Datenbankverbindungen und der Bereitstellung von APIs.

Was sind die globalen Variablen in NodeJS? Was sind die globalen Variablen in NodeJS? Apr 21, 2024 am 04:54 AM

Die folgenden globalen Variablen sind in Node.js vorhanden: Globales Objekt: global Kernmodul: Prozess, Konsole, erforderlich Laufzeitumgebungsvariablen: __dirname, __filename, __line, __column Konstanten: undefiniert, null, NaN, Infinity, -Infinity

Gibt es einen großen Unterschied zwischen NodeJS und Java? Gibt es einen großen Unterschied zwischen NodeJS und Java? Apr 21, 2024 am 06:12 AM

Die Hauptunterschiede zwischen Node.js und Java sind Design und Funktionen: Ereignisgesteuert vs. Thread-gesteuert: Node.js ist ereignisgesteuert und Java ist Thread-gesteuert. Single-Threaded vs. Multi-Threaded: Node.js verwendet eine Single-Threaded-Ereignisschleife und Java verwendet eine Multithread-Architektur. Laufzeitumgebung: Node.js läuft auf der V8-JavaScript-Engine, während Java auf der JVM läuft. Syntax: Node.js verwendet JavaScript-Syntax, während Java Java-Syntax verwendet. Zweck: Node.js eignet sich für I/O-intensive Aufgaben, während Java für große Unternehmensanwendungen geeignet ist.

Welches soll man zwischen NodeJS und Java wählen? Welches soll man zwischen NodeJS und Java wählen? Apr 21, 2024 am 04:40 AM

Node.js und Java haben jeweils ihre Vor- und Nachteile in der Webentwicklung, und die Wahl hängt von den Projektanforderungen ab. Node.js zeichnet sich durch Echtzeitanwendungen, schnelle Entwicklung und Microservices-Architektur aus, während Java sich durch Support, Leistung und Sicherheit auf Unternehmensniveau auszeichnet.

See all articles