이 글에서는 Node.js 모듈의 이벤트 모듈을 이해하고, 이벤트 중심이 무엇인지, NodeJS의 이벤트 아키텍처, 이벤트 모듈의 핵심 API 등을 소개할 것입니다. 도움이 되기를 바랍니다. 모두에게!
공식 설명 인용: Node.js의 핵심 API 대부분은 관용적인 비동기 이벤트 기반 아키텍처를 기반으로 구축되었습니다. 여기서 특정 유형의 객체("트리거"라고 함)는 Function 객체("리스너")가 호출됩니다.
Function
对象("监听器")被调用。
通过对Node的学习及应用,我们知道NodeJS其采用单线程、事件驱动、非阻塞I/O等架构设计,非常适用于高并发、I/O密集型应用。
事件驱动,简单来说就是通过有效方法来监听事件状态的变化,并在发生变化时做出相应的动作。
举一个生活应用的场景来理解:当我们去饭店吃饭点餐,当我们下单之后,服务员告诉我们的订单号(这时候可以理解为注册了一个事件),我们在坐着等候,这时候我们的耳朵就一直监听着服务员的喊号,当喊到我们的时候,我们可以去前台取餐。
NodeJS的事件架构采用经典的--订阅发布模式
订阅发布模式,也可以称之为消息机制,定义了一种依赖关系,这种依赖关系可以理解为 1对N(多个或者单个)观察者们同时监听某一个对象相应的状态变换,一旦变化则通知到所有观察者,从而触发观察者注册的相应事件,该设计模式解决了主体对象与观察者之间功能的耦合。
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');
4.1 eventEmitter.on(eventName, callback)
注册监听事件
参数:
4.2 eventEmitter.once(eventName, callback)
可以注册一个监听器,该监听器最多为特定事件调用一次。 一旦事件被触发,则监听器就会被注销然后被调用。
参数:
4.3 eventEmitter.emit(eventName[, ...args])
触发指定的监听事件
参数:
4.4 eventEmitter.removeListener(eventName, callback)
移除指定事件的监听器,注意:该监听器必须是注册过的。否则无效。
参数:
4.5 EventEmitter.removeAllListeners(eventName)
移除所有监听器,一个事件可以有多个监听,需要全部移除时,可以用此方法。
参数:
需要特别注意的是,如果不传参数,将会移除所有的监听事件,比较暴力,建议慎用。
4.6 EventEmitter.listeners(eventName)
返回名为 eventName
的事件的监听器绑定回调函数数组的副本。
4.7 EventEmitter.eventNames()
返回列出触发器已为其注册监听器的事件的数组。
4.8 EventEmitter.setMaxListeners(n)
默认情况下,如果为特定事件添加了 10
个以上的监听器,则 EventEmitter
将打印警告。
emitter.setMaxListeners() 方法允许修改此特定 EventEmitter
实例的限制。 该值可以设置为 Infinity
(或 0
)以指示无限数量的监听器。
EventEmitter
按照注册的顺序同步
地调用所有监听器。这确保了事件的正确排序,并有助于避免竞争条件和逻辑错误。
当 EventEmitter
实例中发生错误时,典型的操作是触发 'error'
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'))
eventEmitter.on(eventName, callback)
🎜🎜듣기 등록 for events🎜 🎜매개변수:🎜 eventEmitter.once(eventName , callback)
🎜🎜특정 이벤트에 대해 최대 한 번 호출되는 리스너를 등록할 수 있습니다. 이벤트가 트리거되면 리스너가 등록 취소된 후 호출됩니다. 🎜🎜매개변수: 🎜eventEmitter. Emit( eventName[, ...args])
🎜🎜지정된 청취 이벤트를 트리거합니다🎜🎜Parameters:🎜eventEmitter.removeListener(eventName, callback)
🎜🎜리스너 제거 지정된 이벤트 리스너의 경우 참고: 리스너를 등록해야 합니다. 그렇지 않으면 유효하지 않습니다. 🎜🎜매개변수: 🎜EventEmitter.removeAllListeners(eventName) li> code>
🎜🎜모든 리스너를 제거하세요. 하나의 이벤트에 여러 리스너가 있을 수 있습니다. 모두 제거해야 하는 경우 이 방법을 사용할 수 있습니다. 🎜🎜매개변수: 🎜매개변수가 전달되지 않으면 모든 이벤트가 삭제된다는 점에 유의하는 것이 중요합니다. 삭제됩니다. 모니터링 이벤트는 상대적으로 폭력적이므로 주의해서 사용하는 것이 좋습니다.
🎜🎜4.6 EventEmitter.listeners(eventName)
🎜🎜 eventName
복사본이라는 이벤트에 대한 리스너 바인딩 콜백 함수 배열을 반환합니다. . 🎜🎜4.7 EventEmitter.eventNames()
🎜🎜트리거가 리스너를 등록한 이벤트를 나열하는 배열을 반환합니다. 🎜🎜4.8 EventEmitter.setMaxListeners(n)
🎜🎜기본적으로 특정 이벤트에 대해 10
개 이상의 리스너가 추가되면 EventEmitter
는 경고를 인쇄합니다. 🎜🎜emitter.setMaxListeners() 메서드를 사용하면 이 특정 EventEmitter
인스턴스의 제한을 수정할 수 있습니다. 값을 무한대
(또는 0
)로 설정하여 청취자 수에 제한이 없음을 나타낼 수 있습니다. 🎜EventEmitter
는 등록 순서대로 모든 리스너를 동기적으로
호출합니다. 이는 이벤트의 올바른 순서를 보장하고 경쟁 조건 및 논리 오류를 방지하는 데 도움이 됩니다. 🎜EventEmitter
인스턴스에서 오류가 발생하면 일반적인 작업은 'error'를 트리거하는 것입니다. 코드> 이벤트. 이는 Node.js에서 특별한 경우로 처리됩니다. 🎜<p>如果 <code>EventEmitter
没有为 'error'
事件注册至少一个监听器,并且触发 'error'
事件,则会抛出错误,打印堆栈跟踪,然后退出 Node.js 进程。
作为最佳实践,应始终为 'error'
事件添加监听器。
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'))
更多node相关知识,请访问:nodejs 教程!!
위 내용은 Node.js의 이벤트 모듈에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!