node.js 학습 이벤트 모듈 Events 사용 예시

머리말
본 고 는 주로 node.js 사건 모듈 Events 에 사용 되 는 예 시 를 소개 하고 참고 학습 을 제공 합 니 다.다음은 더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 해 보 겠 습 니 다.
환경:Node v 8.2.1;Npm v5.3.0; OS Windows10
1.노드 이벤트 소개
Node 대부분의 핵심 API 는 일반적인 비동기 이벤트 구동 구 조 를 사용 합 니 다.그 중에서 일부 유형의 대상(트리거)은 주기 적 으로 명명 사건 을 촉발 하여 함수 대상(모니터)을 호출 합 니 다.
사건 을 촉발 할 수 있 는 모든 대상 은 EventEmitter 류 의 인 스 턴 스 입 니 다.이 대상 들 은 이벤트 Emitter.on()함 수 를 열 었 습 니 다.대상 이 촉발 할 이름 이벤트 에 하나 이상 의 함 수 를 연결 할 수 있 습 니 다.이벤트 이름 은 보통 낙타 봉 식 문자열 이지 만,유효한 자 바스 크 립 트 속성 이름 도 사용 할 수 있 습 니 다.
EventEmitter 대상 이 이 벤트 를 촉발 할 때 이 이벤트 에 연 결 된 모든 함수 가 동기 화 됩 니 다.모니터 의 반환 값 이 버 려 집 니 다.
2.이벤트 모듈 API 소개

3.몇 가지 예
다음은 위의 API 코드 에 대응 하 는 간단 한 예 입 니 다.
3.1 귀속 과 트리거 이벤트

const EventEmitter = require('events');

//          EventEmitter
class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

myEmitter.on('event', () => {
 console.log('       !');
});

myEmitter.emit('event');
3.2 이벤트 전달 매개 변수

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', (a,b) => {
 console.log(a,b);
 //1,2
}); 
myEmitter.emit('event','a','b');
질문
일반적인 감청 기 함수 가 EventEmitter 에 호출 될 때 표준 this 키 워드 는 감청 기 에 추 가 된 EventEmitter 를 가리 키 는 설정 을 합 니 다.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', function() {
 console.log(this);
 /*
  a b MyEmitter {
   domain: null,
   _events: { event: [Function] },
   _eventsCount: 1,
   _maxListeners: undefined 
  }
 */
 }); 
myEmitter.emit('event');
ES6 의 화살표 함 수 를 모니터 로 사용 할 수도 있다.그러나 이 키 워드 는 더 이상 EventEmitter 인 스 턴 스 를 가리 키 지 않 습 니 다.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', () => {
 console.log(this);
 //{}
});

myEmitter.emit('event');
3.4 비동기 실행
EventListener 는 감청 기 등록 순서에 따라 모든 감청 기 를 동기 화 합 니 다.감청 기 함 수 는setImmediate()또는process.nextTick() 방법 으로 비동기 작업 모드 로 전환 할 수 있 습 니 다.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', (a,b) => {
 setImmediate(()=>{
  //    
  console.log(a,b);
 })
 console.log("c");
});

myEmitter.emit('event','a','b');
//c
//a b
3.5 무한 회 시전 과 1 회 시전
이 벤트 는 기본적으로 무한 횟수 로 트리거 할 수 있 습 니 다.한 번 만 터치 하면 해당 하 는 감청 함수 가 한 번 실 행 됩 니 다.때때로 우 리 는 감청 함 수 를 한 번 만 실행 하고 싶 습 니 다.[once]를 사용 하여 사건 을 연결 할 수 있 습 니 다.
여러 번 시전:

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

let m = 0;

myEmitter.on('event', () => {
 console.log(++m);
});

myEmitter.emit('event'); //1

myEmitter.emit('event'); //2

myEmitter.emit('event'); //3
1 회 시전:

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

let m = 0;

myEmitter.once('event', () => {
 console.log(++m);
});

myEmitter.emit('event'); //1

myEmitter.emit('event'); //  

myEmitter.emit('event'); //  
3.6 오류 사건
EventEmitter 인 스 턴 스 에서 오류 가 발생 하면'error'이벤트 가 발생 합 니 다.EventEmitter 가'error'이벤트 에 최소한 하나의 모니터 를 등록 하지 않 으 면'error'이벤트 가 발생 할 때 오류 가 발생 하고 스 택 추적 을 인쇄 하 며 Node.js 프로 세 스 를 종료 합 니 다.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

myEmitter.emit("error", new Error('whoops!'));
//     ,   Node.js   
Node.js 프로 세 스 붕 괴 를 방지 하기 위해 process 대상 의 uncaughtException 이벤트 에 모니터 를 등록 할 수 있 습 니 다.

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();
//           ,      
process.on("uncaughtException",()=>{
 console.error('   ');
});

myEmitter.emit("error",new Error("whoops"))
위의 이런 방식 은 최선 의 실천 이 아니 라[error]감청 함 수 를 등록 하 는 것 이 좋 습 니 다.
3.7 최대 이벤트 감청 수량 가 져 오기 및 수정
Node 기본 이벤트 의 감청 수량 은 10 개 이 며 10 개가 넘 으 면 경 고 를 보 냅 니 다.

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

console.log(EventEmitter.defaultMaxListeners); //10

for (let i = 0; i < 11; i++) {
 myEmitter.on("event", () => {
  console.log(i);
 });
}
myEmitter.emit("event")
//MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 event listeners added. Use emitter.setMaxListeners() to increase limit
지정 한 EventEmitter 인 스 턴 스 의 모니터 제한 변경

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

myEmitter.setMaxListeners(13);

for (let i = 0; i < 11; i++) {
 myEmitter.on("event", () => {
  console.log(i);
 });
}
myEmitter.emit("event")
3.8 newListener 이벤트
EventEmitter 인 스 턴 스 는 내부 모니터 배열 에 모니터 가 추 가 됩 니 다.[이전]자신의'new Listener'이 벤트 를 촉발 합 니 다.

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter()

myEmitter.once("newListener", (event, listener) => {
 if(event === "event"){
  myEmitter.on("event",()=>{
   console.log("B");
  })
 }
});

myEmitter.on("event",()=>{
 console.log("A");
});

myEmitter.emit("event")
/*
B
A
*/
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기