Latest web development tutorials

Node.js를 EventEmitter

Node.js를 종료하면 모든 비동기 I / O 동작은 이벤트 큐에 이벤트를 송신한다.

많은 개체가 이벤트 분포 Node.js를 : 이벤트 net.Server 분산 객체마다 새로운 연결하는 fs.readStream 개체는 파일을 열 경우에 발행됩니다. 이러한 개체의 모든 events.EventEmitter 인스턴스 이벤트를 생성됩니다.


EventEmitter 클래스

이벤트 모듈은 하나의 객체를 제공합니다 events.EventEmitter. 코어 EventEmitter 이벤트 트리거 및 이벤트 리스너 기능 패키지입니다.

당신은에 의해 ( "이벤트")가 필요 할 수 있습니다 모듈에 액세스 할 수 있습니다.

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

EventEmitter 오브젝트가 인스턴스화 될 때 에러가 발생하면, 상기 '오류'이벤트를 트리거 할 것이다. 새로운 리스너를 추가 할 때, 'newListener'이벤트 리스너가 제거 될 때 '의 removeListener'이벤트가 트리거 트리거됩니다.

여기에서 우리는 간단한 예는 EventEmitter 사용법을 보여줍니다 사용

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
	console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
	event.emit('some_event'); 
}, 1000); 

다음과 같이 실행 결과는 다음과 같습니다

이 코드, 콘솔 출력'some_event 트리거 이벤트'이후 1 초 실행합니다.원리는 객체가 리스너의 이벤트 some_event 이벤트를 등록하고 우리는 다음 some_event 리스너 호출, 1000 밀리 초 개체의 이벤트 후에서는 setTimeout에 의해 some_event 이벤트를 보낼 것입니다.

$ node event.js 
some_event 事件触发

이벤트 이름 및 파라미터들에 의해 각 이벤트 EventEmitter는 이벤트 이름 문자열 일반적 표현 특정 의미이다. 각 이벤트의 경우, EventEmitter 여러 이벤트 리스너를 지원합니다.

이벤트가 발생하면, 이벤트는 이벤트 리스너 순차적 콜백 이벤트 매개 인자로 불리는 등록한다.

우리는 다음과 같은 예를 보자하면이 프로세스를 보여줍니다 :

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

다음과 같이 실행 위의 코드를 실행합니다 :

$ node event.js 
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

이벤트에 대한 등록 된 위의 예, 이미 터 someEvent는 두 개의 이벤트 리스너는 다음 someEvent 이벤트를 트리거.

작동 결과는 호출 된 두 개의 이벤트 리스너 콜백 함수에서 볼 수있다. 이 EventEmitter 쉬운 사용법입니다.

EventEmitter 같은방출특성들을제공한다.기능 이벤트기능을 결합하는 데 사용됩니다에,속성은 이벤트를 트리거하는 데 사용됩니다 방출한다. 다음에 우리는 EventEmitter 특정 속성을 설명 보인다.

방법

아니오. 방법 및 설명
(1) 의 addListener (이벤트, 리스너)
배열의 마지막으로, 지정된 이벤트 리스너의 청취자를 추가합니다.
에 (이벤트, 리스너)
리스너를 등록 할 지정된 이벤트에 대한 문자열 이벤트와 콜백 함수를 사용할 수 있습니다.
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 한 번 (이벤트, 리스너)
대부분의 청취자가 즉시 트리거 수신기를 해제 한 후, 한 번 트리거 것, 지정된 이벤트에 대한 하나의 리스너를 등록합니다.
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 의 removeListener (이벤트, 리스너)
리스너에 지정된 이벤트를 삭제 해, 리스너는 이벤트가 등록 된 리스너가 있어야합니다.
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
(5) removeAllListeners ([이벤트])
모든 이벤트에 대한 모든 청취자를 삭제 해, 지정된 이벤트 경우, 모든 청취자의 지정된 이벤트를 제거합니다.
6 setMaxListeners (N)
기본적으로 EventEmitters 당신은 10가 출력 경고 메시지를 통해 리스너를 추가합니다. setMaxListeners 기능이 기본 한계 청취자의 수를 증가 시키는데 이용된다.
(7) 리스너 (이벤트)
지정된 이벤트에 대한 청취자의 배열을 돌려줍니다.
8 방출 (이벤트, [ARG1], [ARG2], [...])
등록 된 이벤트 리스너가 true를 돌려주는이있는 경우 각 리스너 실행 순서 매개 변수, 그렇지 않은 경우는 false를 돌려줍니다.

클래스 메소드

아니오. 방법 및 설명
(1) listenerCount (이미 터, 이벤트)
지정된 이벤트에 대한 청취자의 수를 돌려줍니다.

행사

아니오. 이벤트 및 설명
(1) newListener
  • 이벤트 - 이벤트의 문자열 이름

  • 청취자 - 이벤트 처리 기능

새 리스너를 추가하면 이벤트가 트리거됩니다.

의 removeListener
  • 이벤트 - 이벤트의 문자열 이름

  • 청취자 - 이벤트 처리 기능

지정된 청취자의 배열에서 리스너를 제거합니다. 이 인덱스에 변경 않습니다 리스너 리스너 후 삭제한다는 것입니다.

연결을 통해 다음의 예는 (연결) 이벤트는 EventEmitter 클래스 응용 프로그램을 보여줍니다.

다음과 같이 main.js 파일을 만듭니다

var events = require('events');
var eventEmitter = new events.EventEmitter();

// 监听器 #1
var listener1 = function listener1() {
   console.log('监听器 listener1 执行。');
}

// 监听器 #2
var listener2 = function listener2() {
  console.log('监听器 listener2 执行。');
}

// 绑定 connection 事件,处理函数为 listener1 
eventEmitter.addListener('connection', listener1);

// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

// 处理 connection 事件 
eventEmitter.emit('connection');

// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");

다음과 같이 위의 코드는 실행 결과는 다음과 같습니다

$ node main.js
2 个监听器监听连接事件。
监听器 listener1 执行。
监听器 listener2 执行。
listener1 不再受监听。
监听器 listener2 执行。
1 个监听器监听连接事件。
程序执行完毕。

오류 이벤트

EventEmitter 특별한 이벤트 오류, 그것은 의미 론적 오류가 정의, 우리는 일반적 예외의 얼굴에 오류 이벤트를 트리거합니다.

오류가 발생하면, EventEmitter는 청취자에 대한 응답은 Node.js를 예외로 사용하지 않는 경우, 에러 메시지가 프로그램을 종료 할 것을 규정한다.

우리가 일반적으로 오류 이벤트 리스너 설정을 트리거 오류가 프로그램이 충돌을 통해 발생 피할 대상으로합니다. 예를 들면 :

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error'); 

다음 오류가 표시됩니다 실행

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
Error: Uncaught, unspecified 'error' event. 
at EventEmitter.emit (events.js:50:15) 
at Object.<anonymous> (/home/byvoid/error.js:5:9) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

상속 EventEmitter

대부분의 경우 우리는 직접 EventEmitter를 사용하지만, 객체를 상속하지 않습니다. 포함 FS, 그물, HTTP를 포함 한 지원 사고 대응 핵심 모듈은 EventEmitter의 하위 클래스가있다.

이유는 무엇입니까? 두 가지 이유가 있습니다 :

먼저, 개체가 발광 모니터 의미론을 만족 이벤트의 실제 구현의 기능을 가지며, 이벤트는 객체가 될 것이다.

둘째, 자바 스크립트 객체기구 원래 상속을 방해하지 EventEmitter 프로토 기반 멀티 파트 지원 상속 개체이다.