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
类,然后生成实例 emitter
(EventEmitter
十分重要,比如后续文章会介绍的 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')
执行结果:
如果想把监听事件添加到最前面,可以使用 emitter.prependListener()
(或者 emitter.prependOnceListener()
,即提前但只监听一次):
emitter.on('test', () => { console.log('监听到了事件发射,1') }) emitter.prependListener('test', () => { console.log('监听到了事件发射,2') }) emitter.emit('test')
现在的结果如下:
可以使用 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()
来增加最大限制数量:
如果我们想知道当前 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()
EventEmitter
클래스를 가져온 다음 인스턴스 emitter
를 생성합니다. ( EventEmitter
는 매우 중요합니다. 예를 들어 후속 기사에서 소개할 stream
은 EventEmitter
의 인스턴스입니다.): function handler1() {} function handler2() {} emitter.on('test', handler1) emitter.on('test', handler2) console.log(emitter.listeners('test'))Then
emitter.on()
을 사용하여 이벤트를 모니터링할 수 있습니다. 전달된 첫 번째 매개변수는 이벤트가 모니터링된 후 실행될 콜백입니다. 이벤트가 시작되면 전달됩니다. 콜백 함수의 경우 하나씩 가져오거나 다음과 같이 사용할 수 있습니다함수의 나머지 매개변수Get: [권장 관련 튜토리얼: nodejs 동영상 튜토리얼, 프로그래밍 교육
】rrreee일회성 이벤트만 듣고 싶다면 emitter.once()
를 사용하면 됩니다. rrreee
emitter.prependListener()
(또는 emitter.prependOnceListener)를 사용할 수 있습니다. ()
, 미리 듣기를 의미하지만 한 번만): 🎜rrreee🎜현재 결과는 다음과 같습니다: 🎜🎜🎜 이미터를 사용하여 제거 가능 .off()
(또는 emitter.removeListener()
) 이벤트를 모니터링하려면 해당 이벤트 이름과 콜백 함수를 전달해야 하므로 수신할 때의 콜백을 직접 정의할 수 없습니다. 위와 같이 emitter.on()
내부에서는 외부 정의여야 하며 콜백에 대한 참조를 전달해야 합니다. 🎜rrreee🎜emitter.off()
는 제거만 가능합니다. 하나의 리스너, 리스너 콜백이 전달되어야 합니다. 리스너가 여러 개 있고 모두 제거하려는 경우 emitter.removeAllListeners()
를 사용할 수 있습니다. 🎜rrreee🎜emitter.removeAllListeners ()
매개변수가 전달되지 않으면 모든 이벤트 이름에 대한 모든 이벤트 리스너가 제거됩니다. 또한 이벤트 이름을 전달할 수도 있으며, 이벤트 이름에 해당하는 모든 이벤트 리스너가 제거됩니다. 🎜emitter.getMaxListeners()
로 확인할 수 있습니다. 🎜rrreee🎜예를 들어 저는 11번 썼습니다. emitter.on('test', handler)
, 오류가 보고되고 emitter.setMaxListeners()
를 사용하여 최대 제한을 늘리라는 메시지가 표시됩니다. 🎜🎜🎜🎜알고 싶다면 현재 EventEmitter 객체의 이벤트 이름 리스너는 몇 명이며 최대 제한을 초과하는지 여부는 emitter.listenerCount()
를 사용하여 수신 이벤트 이름을 확인할 수 있습니다: 🎜rrreee🎜이벤트 이름 및 리스너 가져오기🎜🎜에 등록된 모든 이벤트 이름을 가져오려면 emitter.eventNames()
를 사용하세요. 현재 EventEmitter 객체이며 반환된 이벤트 문자열은 배열: 🎜rrreee🎜로 구성됩니다. 이벤트에 해당하는 모든 리스너를 가져오려면 emitter.listeners()
를 사용하여 이벤트를 전달할 수 있습니다. 이름: 🎜rrreee🎜결과는 다음과 같습니다: 🎜🎜🎜🎜 🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! 🎜위 내용은 Node의 이벤트 모듈에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!