>  기사  >  웹 프론트엔드  >  Node.js의 이벤트 모듈에 대해 이야기해 보겠습니다.

Node.js의 이벤트 모듈에 대해 이야기해 보겠습니다.

青灯夜游
青灯夜游앞으로
2021-12-06 18:42:214659검색

이 글에서는 Node.js 모듈의 이벤트 모듈을 이해하고, 이벤트 중심이 무엇인지, NodeJS의 이벤트 아키텍처, 이벤트 모듈의 핵심 API 등을 소개할 것입니다. 도움이 되기를 바랍니다. 모두에게!

Node.js의 이벤트 모듈에 대해 이야기해 보겠습니다.

공식 설명 인용: Node.js의 핵심 API 대부분은 관용적인 비동기 이벤트 기반 아키텍처를 기반으로 구축되었습니다. 여기서 특정 유형의 객체("트리거"라고 함)는 Function 객체("리스너")가 호출됩니다. Function 对象("监听器")被调用。

通过对Node的学习及应用,我们知道NodeJS其采用单线程、事件驱动、非阻塞I/O等架构设计,非常适用于高并发、I/O密集型应用。

1. 什么是事件驱动?

事件驱动,简单来说就是通过有效方法来监听事件状态的变化,并在发生变化时做出相应的动作。

举一个生活应用的场景来理解:当我们去饭店吃饭点餐,当我们下单之后,服务员告诉我们的订单号(这时候可以理解为注册了一个事件),我们在坐着等候,这时候我们的耳朵就一直监听着服务员的喊号,当喊到我们的时候,我们可以去前台取餐。

2. 事件模型

NodeJS的事件架构采用经典的--订阅发布模式

订阅发布模式,也可以称之为消息机制,定义了一种依赖关系,这种依赖关系可以理解为 1对N(多个或者单个)观察者们同时监听某一个对象相应的状态变换,一旦变化则通知到所有观察者,从而触发观察者注册的相应事件,该设计模式解决了主体对象与观察者之间功能的耦合。

3. events模块

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. Events模块核心API

4.1 eventEmitter.on(eventName, callback)

注册监听事件

参数:

  • eventName: 事件名称
  • callback: 事件触发被调用回调函数

4.2 eventEmitter.once(eventName, callback)

可以注册一个监听器,该监听器最多为特定事件调用一次。 一旦事件被触发,则监听器就会被注销然后被调用。

参数:

  • eventName: 事件名称
  • callback: 事件触发被调用回调函数

4.3 eventEmitter.emit(eventName[, ...args])

触发指定的监听事件

参数:

  • eventName: 事件名称
  • args可选参数,按顺序传入回调函数的参数;

4.4 eventEmitter.removeListener(eventName, callback)

移除指定事件的监听器,注意:该监听器必须是注册过的。否则无效。

参数:

  • eventName: 事件名称
  • callback: 回调函数

4.5 EventEmitter.removeAllListeners(eventName)

移除所有监听器,一个事件可以有多个监听,需要全部移除时,可以用此方法。

参数:

  • eventName: 需要全部移除的事件名称;

需要特别注意的是,如果不传参数,将会移除所有的监听事件,比较暴力,建议慎用。

4.6 EventEmitter.listeners(eventName)

返回名为 eventName 的事件的监听器绑定回调函数数组的副本。

4.7 EventEmitter.eventNames()

返回列出触发器已为其注册监听器的事件的数组。

4.8 EventEmitter.setMaxListeners(n)

默认情况下,如果为特定事件添加了 10 个以上的监听器,则 EventEmitter 将打印警告。

emitter.setMaxListeners() 方法允许修改此特定 EventEmitter 实例的限制。 该值可以设置为 Infinity(或 0)以指示无限数量的监听器。

5. 同步异步的问题

EventEmitter 按照注册的顺序同步地调用所有监听器。这确保了事件的正确排序,并有助于避免竞争条件和逻辑错误。

6.错误处理

当 EventEmitter 实例中发生错误时,典型的操作是触发 'error'

🎜Node🎜에 대한 연구와 적용을 통해 우리는 NodeJS가 단일 스레드, 이벤트 중심, 비차단 I/O 및 기타 아키텍처 설계를 채택한다는 것을 알았습니다. 이는 높은 동시성에 매우 적합합니다. /O 집약적 애플리케이션. 🎜

1. 이벤트 드리븐이란?

🎜이벤트 기반은 간단히 말해서 효과적인 방법을 사용하여 이벤트 상태의 변경 사항을 모니터링하고 변경 사항이 발생할 때 해당 조치를 취하는 것입니다. 🎜🎜이해를 돕기 위해 생활 응용 시나리오를 생각해 봅시다. 우리가 음식을 주문하기 위해 레스토랑에 갈 때, 주문을 한 후 웨이터가 주문 번호를 알려주고(이것은 이벤트 등록으로 이해될 수 있습니다), 우리는 앉아서 앉아서 우리는 웨이터의 부름을 듣고 있었습니다. 우리는 프론트 데스크로 가서 식사를 할 수 있습니다. 🎜

2. 이벤트 모델

🎜NodeJS의 이벤트 아키텍처는 고전적인 구독 게시 모델을 채택합니다.🎜🎜메시지 메커니즘이라고도 하는 구독 게시 모델은 이러한 종속 관계를 정의할 수 있습니다. 한 쌍의 N(다중 또는 단일) 관찰자가 동시에 객체의 해당 상태 전환을 모니터링하는 것으로 이해됩니다. 변경이 발생하면 모든 관찰자에게 알림이 전달되어 관찰자가 등록한 해당 이벤트가 발생합니다. 관찰자와의 기능적 결합 문제. 🎜

3. 이벤트 모듈

🎜 이벤트 모듈은 NodeJS의 매우 중요한 모듈입니다. 노드의 대부분의 모듈 구현은 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.on('error', (e) => {
  console.log(e)
})

myEmitter.emit('hello');
myEmitter.emit('error', new Error('an error happen'))

4. 이벤트 모듈 핵심 API

🎜4.1 eventEmitter.on(eventName, callback)🎜🎜듣기 등록 for events🎜 🎜매개변수:🎜
  • eventName: 이벤트 이름
  • callback: 이벤트가 트리거될 때 호출되는 콜백 함수
🎜4.2 eventEmitter.once(eventName , callback)🎜🎜특정 이벤트에 대해 최대 한 번 호출되는 리스너를 등록할 수 있습니다. 이벤트가 트리거되면 리스너가 등록 취소된 후 호출됩니다. 🎜🎜매개변수: 🎜
  • eventName: 이벤트 이름
  • 콜백: 이벤트가 트리거될 때 호출되는 콜백 함수
🎜4.3 eventEmitter. Emit( eventName[, ...args])🎜🎜지정된 청취 이벤트를 트리거합니다🎜🎜Parameters:🎜
  • eventName: 이벤트 이름
  • args 선택 사항 매개변수, 콜백 함수의 매개변수를 순서대로 전달합니다.
🎜4.4 eventEmitter.removeListener(eventName, callback)🎜🎜리스너 제거 지정된 이벤트 리스너의 경우 참고: 리스너를 등록해야 합니다. 그렇지 않으면 유효하지 않습니다. 🎜🎜매개변수: 🎜
  • eventName: 이벤트 이름
  • 콜백: 콜백 함수
🎜4.5 EventEmitter.removeAllListeners(eventName) li> code>🎜🎜모든 리스너를 제거하세요. 하나의 이벤트에 여러 리스너가 있을 수 있습니다. 모두 제거해야 하는 경우 이 방법을 사용할 수 있습니다. 🎜🎜매개변수: 🎜
  • eventName: 제거해야 하는 모든 이벤트의 이름
🎜매개변수가 전달되지 않으면 모든 이벤트가 삭제된다는 점에 유의하는 것이 중요합니다. 삭제됩니다. 모니터링 이벤트는 상대적으로 폭력적이므로 주의해서 사용하는 것이 좋습니다. 🎜🎜4.6 EventEmitter.listeners(eventName)🎜🎜 eventName 복사본이라는 이벤트에 대한 리스너 바인딩 콜백 함수 배열을 반환합니다. . 🎜🎜4.7 EventEmitter.eventNames()🎜🎜트리거가 리스너를 등록한 이벤트를 나열하는 배열을 반환합니다. 🎜🎜4.8 EventEmitter.setMaxListeners(n)🎜🎜기본적으로 특정 이벤트에 대해 10개 이상의 리스너가 추가되면 EventEmitter는 경고를 인쇄합니다. 🎜🎜emitter.setMaxListeners() 메서드를 사용하면 이 특정 EventEmitter 인스턴스의 제한을 수정할 수 있습니다. 값을 무한대(또는 0)로 설정하여 청취자 수에 제한이 없음을 나타낼 수 있습니다. 🎜

5. 동기화 및 비동기 문제

🎜EventEmitter는 등록 순서대로 모든 리스너를 동기적으로 호출합니다. 이는 이벤트의 올바른 순서를 보장하고 경쟁 조건 및 논리 오류를 방지하는 데 도움이 됩니다. 🎜

6. 오류 처리

🎜 EventEmitter 인스턴스에서 오류가 발생하면 일반적인 작업은 'error'를 트리거하는 것입니다. 코드> 이벤트. 이는 Node.js에서 특별한 경우로 처리됩니다. 🎜<p>如果 <code>EventEmitter 没有为 'error' 事件注册至少一个监听器,并且触发 'error' 事件,则会抛出错误,打印堆栈跟踪,然后退出 Node.js 进程。

作为最佳实践,应始终为 'error' 事件添加监听器。

import { EventEmitter } from &#39;events&#39;;

class MyEmiter extends EventEmitter{};

const myEmitter = new MyEmiter();

myEmitter.on(&#39;hello&#39;, () => {
  console.log(&#39;hello 有人喊你啦&#39;);
});

myEmitter.on(&#39;error&#39;, (e) => {
  console.log(e)
})

myEmitter.emit(&#39;hello&#39;);
myEmitter.emit(&#39;error&#39;, new Error(&#39;an error happen&#39;))

更多node相关知识,请访问:nodejs 教程!!

위 내용은 Node.js의 이벤트 모듈에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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