Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Analyse des Ereignismoduls von Node

Eine kurze Analyse des Ereignismoduls von Node

青灯夜游
青灯夜游nach vorne
2023-02-20 19:33:302252Durchsuche

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()

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

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

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

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

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

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

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

执行结果:

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')

现在的结果如下:

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', '无法被监听到')

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

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

emitter.removeAllListeners()

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

其它一些方法

监听器数量限制

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

console.log(emitter.getMaxListeners()) // 10

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

Eine kurze Analyse des Ereignismoduls von Node

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

console.log(emitter.listenerCount('test'))

获取事件名称和监听器

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

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

console.log(emitter.eventNames()) // [ 'test1', 'test2' ]

如果想获取某个事件对应的所有监听器,可以使用 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'))

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen