>  기사  >  웹 프론트엔드  >  Node의 이벤트 모듈에 대한 간략한 분석

Node의 이벤트 모듈에 대한 간략한 분석

青灯夜游
青灯夜游앞으로
2023-02-20 19:33:302194검색

Node의 이벤트 모듈에 대한 간략한 분석

vue 프로젝트에서는 때때로 글로벌 이벤트 버스를 사용하여 구성 요소 간의 통신을 관리합니다. vue2 프로젝트에서는 $emit, $on$off를 사용하여 eventHub를 캡슐화할 수 있습니다. vue3$on 및 $off가 제거되었으므로 mitt 라이브러리나 Tiny-Emitter 라이브러리를 사용할 수 있습니다. 노드에는 이벤트를 모니터링하고 내보내는 데 도움이 되는 이벤트 모듈이 내장되어 있으므로 그렇게 번거로울 필요가 없습니다. $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')

执行结果:

Node의 이벤트 모듈에 대한 간략한 분석

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

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

emitter.emit('test')

现在的结果如下:

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() 来增加最大限制数量:

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

이벤트 모니터링 및 방출

먼저 CommonJS 구문을 사용하여 EventEmitter 클래스를 가져온 다음 인스턴스 emitter를 생성합니다. ( EventEmitter는 매우 중요합니다. 예를 들어 후속 기사에서 소개할 streamEventEmitter의 인스턴스입니다.):

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

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

Then emitter.on()을 사용하여 이벤트를 모니터링할 수 있습니다. 전달된 첫 번째 매개변수는 이벤트가 모니터링된 후 실행될 콜백입니다. 이벤트가 시작되면 전달됩니다. 콜백 함수의 경우 하나씩 가져오거나 다음과 같이 사용할 수 있습니다함수의 나머지 매개변수

Get: [권장 관련 튜토리얼: nodejs 동영상 튜토리얼Node의 이벤트 모듈에 대한 간략한 분석, 프로그래밍 교육

rrreee일회성 이벤트만 듣고 싶다면 emitter.once()를 사용하면 됩니다. rrreee

아래 예시처럼 여러 곳에서 이벤트를 모니터링한다면, 일단 이벤트가 방출되면 청취 콜백이 순서대로 트리거됩니다: 🎜rrreee🎜실행 결과: 🎜🎜 Node의 이벤트 모듈에 대한 간략한 분석🎜🎜청취 이벤트를 전면에 추가하려면 emitter.prependListener()(또는 emitter.prependOnceListener)를 사용할 수 있습니다. (), 미리 듣기를 의미하지만 한 번만): 🎜rrreee🎜현재 결과는 다음과 같습니다: 🎜🎜Node의 이벤트 모듈에 대한 간략한 분석🎜

이벤트 리스너 제거

🎜이미터를 사용하여 제거 가능 .off() (또는 emitter.removeListener()) 이벤트를 모니터링하려면 해당 이벤트 이름과 콜백 함수를 전달해야 하므로 수신할 때의 콜백을 직접 정의할 수 없습니다. 위와 같이 emitter.on() 내부에서는 외부 정의여야 하며 콜백에 대한 참조를 전달해야 합니다. 🎜rrreee🎜emitter.off()는 제거만 가능합니다. 하나의 리스너, 리스너 콜백이 전달되어야 합니다. 리스너가 여러 개 있고 모두 제거하려는 경우 emitter.removeAllListeners()를 사용할 수 있습니다. 🎜rrreee🎜emitter.removeAllListeners () 매개변수가 전달되지 않으면 모든 이벤트 이름에 대한 모든 이벤트 리스너가 제거됩니다. 또한 이벤트 이름을 전달할 수도 있으며, 이벤트 이름에 해당하는 모든 이벤트 리스너가 제거됩니다. 🎜

다른 방법

🎜청취자 수 제한🎜 🎜1 EventEmitter 객체에서 특정 이벤트 이름에 대한 최대 리스너 수는 기본적으로 10입니다. 이는 emitter.getMaxListeners()로 확인할 수 있습니다. 🎜rrreee🎜예를 들어 저는 11번 썼습니다. emitter.on('test', handler), 오류가 보고되고 emitter.setMaxListeners()를 사용하여 최대 제한을 늘리라는 메시지가 표시됩니다. 🎜🎜Node의 이벤트 모듈에 대한 간략한 분석🎜🎜알고 싶다면 현재 EventEmitter 객체의 이벤트 이름 리스너는 몇 명이며 최대 제한을 초과하는지 여부는 emitter.listenerCount()를 사용하여 수신 이벤트 이름을 확인할 수 있습니다: 🎜rrreee🎜이벤트 이름 및 리스너 가져오기🎜🎜에 등록된 모든 이벤트 이름을 가져오려면 emitter.eventNames()를 사용하세요. 현재 EventEmitter 객체이며 반환된 이벤트 문자열은 배열: 🎜rrreee🎜로 구성됩니다. 이벤트에 해당하는 모든 리스너를 가져오려면 emitter.listeners()를 사용하여 이벤트를 전달할 수 있습니다. 이름: 🎜rrreee🎜결과는 다음과 같습니다: 🎜🎜🎜🎜 🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! 🎜

위 내용은 Node의 이벤트 모듈에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제