소개 및 정보
http://nodejs.org/api/events.html
http://www.infoq.com/cn/articles/tyq-nodejs-event
이벤트는 Node.js의 가장 중요한 모듈입니다. 이벤트 모듈은 객체 event.eventimitter 만 제공합니다. Eventemitter의 핵심은 이벤트 시작 및 이벤트 리스너입니다.
Node.js의 대부분의 모듈은 이벤트 모듈에서 상속됩니다.
DOM 트리의 이벤트와 달리 버블 링, 레이어 별 캡처와 같은 활동은 없습니다.
이벤트 미터는 여러 이벤트 리스너를 지원합니다. 이벤트가 시작되면이 이벤트에 등록 된 이벤트 리스너가 순서대로 호출되며 이벤트 매개 변수는 콜백 함수 매개 변수로 전달됩니다.
액세스 방법 :
코드 사본은 다음과 같습니다.
요구 ( '이벤트');
Emitter.on (이벤트, 청취자)
코드 사본은 다음과 같습니다.
/*
이벤트 모듈을 호출하여 이벤트를 얻습니다 .EventImitter 객체
*/
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
/*
eventItter.on (이벤트, 리스너) 이벤트에 대한 리스너를 등록하십시오
매개 변수 1 : 이벤트 문자열, 이벤트 이름
매개 변수 2 : 콜백 함수
*/
ee.on ( 'some_events', function (foo, bar) {
Console.log ( "1st Listence Event, Parameter foo =" + foo + ", bar =" + bar);
});
Console.log ( '첫 번째 라운드');
ee.emit ( 'some_events', 'Wilson', 'Zhong');
Console.log ( '2 라운드');
ee.emit ( 'some_events', 'wilson', 'z');
eventItter.on (이벤트, 리스너) 샘플 소스 코드
Emiter.emit (이벤트, [Arg1], [arg2], [...])
코드 사본은 다음과 같습니다.
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
ee.on ( 'some_events', function (foo, bar) {
Console.log ( "1st Listence Event, Parameter foo =" + foo + ", bar =" + bar);
});
/*
eventItter.emit (event, [arg1], [arg2], [...])는 지정된 이벤트를 트리거합니다
매개 변수 1 : 이벤트 문자열, 이벤트 이름
매개 변수 2 : 선택적 매개 변수, 콜백 함수의 매개 변수를 순서대로 전달합니다.
반환 가치 :이 이벤트가 듣는 지 여부
*/
var issuccess = ee.emit ( 'some_events', 'wilson', 'Zhong');
ee.on ( 'some_events', function (foo, bar) {
console.log ( "2 차 청취 이벤트, 파라미터 foo =" + foo + ", bar =" + bar);
});
ee.emit ( 'some_events', 'zhong', 'wei');
var issuccess2 = ee.emit ( 'Other_events', 'Wilson', 'Zhong');
Console.log (issuccess);
Console.log (issuccess2);
Emitter.emit (Event, [arg1], [arg2], [...]) 샘플 소스 코드
이 예제는 세 가지 트리거링 이벤트 작업을 수행했는데, 여기서 some_events는 청취를 등록하고, Emit 함수는 호출 할 때 true를 반환하고, Other_Events는 청취를 등록하지 않으며 Emit 함수는 거짓을 반환하여 이벤트가 듣지 않음을 나타냅니다. 물론, 당신은 반환 값을 무시할 수 있습니다!
Emitter.once (이벤트, 청취자)
코드 사본은 다음과 같습니다.
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
/*
eventimitter.once (이벤트, 청취자) 이벤트에 대한 일회성 청취 등록, 한 번 트리거 후 청취 제거
매개 변수 1 : 이벤트 문자열, 이벤트 이름
매개 변수 2 : 콜백 함수
*/
ee.once ( 'some_events', function (foo, bar) {
Console.log ( "1st Listence Event, Parameter foo =" + foo + ", bar =" + bar);
});
Console.log ( '첫 번째 라운드');
ee.emit ( 'some_events', 'Wilson', 'Zhong');
Console.log ( '2 라운드');
var issuccess = ee.emit ( 'some_events', 'wilson', 'Zhong');
Console.log (issuccess);
Emitter.once (이벤트, 리스너) 샘플 소스 코드
위의 예제 코드 실행 결과에서, 우리는 imitter.once가있는 some_events에 대한 리스너를 등록한 후, 두 라운드의 콜 emitter.emit에서 트리거되고 두 번째 라운드는 False를 반환합니다. 이는 리스너를 이미 터로 등록하는 것이 리스너를 이미 터로 등록하는 것과 약간 다르다는 것을 의미합니다.
Emitter.once 등록 청취는 일회성 청취입니다. 한 번 트리거되면 청취가 제거됩니다! 물론, 그것은 이름에서 더 분명합니다 ^_ ^!
Emitter.removelistener (이벤트, 리스너)
실패한 장면을 먼저 살펴 보겠습니다 ~~~
코드 사본은 다음과 같습니다.
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
ee.on ( 'some_events', function (foo, bar) {
Console.log ( "1st Listence Event, Parameter foo =" + foo + ", bar =" + bar);
});
/*
API에서 Removelistener 제거 방법을 보았을 때 이렇게되어야한다고 생각했습니다.
그러나 결과는^_^!!!
*/
ee.removelistener ( 'some_events', function () {
console.log ( '성공적으로 이벤트를 제거했습니다. some_events 청취!');
});
Console.log ( '첫 번째 라운드');
ee.emit ( 'some_events', 'Wilson', 'Zhong');
Emitter.removelistener (이벤트, 리스너) 샘플 실패 시나리오 소스 코드
Emitter.on을 사용하여 some_events에 대한 리스너를 등록했을 때 Emitter.removelistener를 사용하여 some_events의 리스너를 제거한 다음 Emitter.emit에 전화하여 트리거를했습니다. 마침내, 나는 상상했듯이 그것이 진행되지 않는다는 것을 알았습니다! 왜?
자연스럽게 emiiter.removelistener의 두 번째 매개 변수는 콜백 함수이므로 API를주의 깊게 읽어야합니다! ! !
또 다른 성공적인 장면을 보자 ~~~
코드 사본은 다음과 같습니다.
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
var Learger = function (foo, bar)
{
Console.log ( "1st Listence Event, Parameter foo =" + foo + ", bar =" + bar);
}
var listener2 = function (foo, bar)
{
Console.log ( "2 차 청취 이벤트, 파라미터 foo =" + foo + ", bar =" + bar);
}
var Leater3 = 함수 (foo, bar)
{
console.log ( "3 차 청취 이벤트, 파라미터 foo =" + foo + ", bar =" + bar);
}
ee.on ( 'some_events', 청취자);
ee.on ( 'some_events', Listener2);
ee.on ( 'some_events', Listener3);
/*
eventImitter.removelistener (이벤트, 리스너)는 지정된 이벤트의 리스너를 제거합니다
참고 : 청취자는 등록해야합니다
추신 : 이전 예제 후에는 실패합니다. 가장 큰 이유는 청취자가 무시되기 때문입니다. 이벤트 이름을 전달해도 괜찮다고 생각하는 것은 당연합니다. 그래서 그것은 비극입니다!
*/
ee.removelistener ( 'some_events', 리스너);
ee.removelistener ( 'some_events', Listener3);
ee.emit ( 'some_events', 'Wilson', 'Zhong');
Emitter.removelistener (이벤트, 리스너) 샘플 성공적인 시나리오 소스 코드
나는 예제 쓰기 방법을 사용하고, some_events에 3 명의 청취자를 추가하고, 첫 번째와 세 번째 청취자를 제거하고, 마침내 imitter.emit로 some_events를 트리거했습니다. 출력 결과는 첫 번째와 세 번째 청취자가 이미 터로 제거 된 것을 찾기가 어렵지 않습니다.
물론, 그것은 사람들에게 유해합니다. removelistener의 두 번째 매개 변수는 성공적인 제거 후 콜백 함수가 아니라 제거 될 리스너입니다 ...^_^!
Emitter.removealllisteners ([이벤트])
Emitter.removelistener가 사용되었지만 이벤트에는 여러 청취자가있을 수 있습니다. 모든 것을 제거해야 할 때, 분명히 하나씩 제거하는 유쾌한 방법은 아니며 게으른 성격을 준수하지 않습니다!
이미 터가 가져온 편의를 경험합시다.
코드 사본은 다음과 같습니다.
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
var Learger = function (foo, bar)
{
Console.log ( "1st Listence Event, Parameter foo =" + foo + ", bar =" + bar);
}
var listener2 = function (foo, bar)
{
Console.log ( "2 차 청취 이벤트, 파라미터 foo =" + foo + ", bar =" + bar);
}
ee.on ( 'some_events', 청취자);
ee.on ( 'some_events', Listener2);
ee.on ( 'Other_Events', 함수 (foo, bar)
{
Console.log ( "기타 청취 이벤트, 파라미터 foo =" + foo + ", bar =" + bar);
});
/*
eventimitter.removealllisteners ([이벤트]) 모든 청취자 (배치 이벤트)를 제거합니다
매개 변수 1 : 선택적 매개 변수, 이벤트 문자열, 이벤트 이름
*/
ee.removealllisteners ( 'some_events');
ee.emit ( 'some_events', 'Wilson', 'Zhong');
ee.emit ( 'Other_events', 'Wilson', 'Zhong');
EMITTER.REMOVEALLLISTENERS 예제 수신 이벤트 이름 매개 변수에 대한 소스 코드
위의 실행 결과를 살펴보면 두 명의 청취자가 some_events에 등록되었음을 알 수 있습니다. 한 청취자는 Other_events에 등록되었습니다. 나는 imitter.removealllisteners에게 전화를 걸어 some_events 이벤트 이름을 전달했습니다.
마지막으로, Emitter를 사용하여 기능을 사용하여 Some_events 및 Other_events의 두 이벤트를 트리거하십시오. 마지막으로, some_events에 의해 등록 된 두 청취자는 존재하지 않는 반면, Other_events에 의해 등록 된 청취자는 여전히 존재합니다.
이는 Emitter.removealllisteners가 이벤트 이름을 매개 변수로 전달할 때 이벤트 이름을 통과하는 모든 청취자가 다른 이벤트 리스너에게 영향을 미치지 않고 제거됩니다!
이벤트 이름 매개 변수를 전달하지 않고도 imitter.removealllisteners를 사용할 수 있습니다. 직접 실행하십시오
코드 사본은 다음과 같습니다.
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
var Learger = function (foo, bar)
{
Console.log ( "1st Listence Event, Parameter foo =" + foo + ", bar =" + bar);
}
var listener2 = function (foo, bar)
{
Console.log ( "2 차 청취 이벤트, 파라미터 foo =" + foo + ", bar =" + bar);
}
ee.on ( 'some_events', 청취자);
ee.on ( 'some_events', Listener2);
ee.on ( 'Other_Events', 함수 (foo, bar)
{
Console.log ( "기타 청취 이벤트, 파라미터 foo =" + foo + ", bar =" + bar);
});
/*
eventimitter.removealllisteners ([이벤트]) 모든 청취자 (배치 이벤트)를 제거합니다
매개 변수 1 : 선택적 매개 변수, 이벤트 문자열, 이벤트 이름
*/
ee.removealllisteners ();
ee.emit ( 'some_events', 'Wilson', 'Zhong');
ee.emit ( 'Other_events', 'Wilson', 'Zhong');
imitter.removealllisteners 매개 변수를 전달하지 않고 샘플 소스 코드
샘플 코드는 Emitter.removealllisteners를 호출 할 때 매개 변수를 전달할 때와 거의 동일합니다. 지정된 이벤트 이름이 전달되지 않습니다.
결과를 실행하면 some_events 및 기타 _events 리스너가 더 이상 존재하지 않으며 모든 청취자가 제거됩니다! (더 폭력적인 방법은주의해서 사용해야합니다 ~~)
Emitter.listeners (이벤트)
코드 사본은 다음과 같습니다.
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
var Learger = function (foo, bar)
{
Console.log ( "1st Listence Event, Parameter foo =" + foo + ", bar =" + bar);
}
var listener2 = function (foo, bar)
{
Console.log ( "2 차 청취 이벤트, 파라미터 foo =" + foo + ", bar =" + bar);
}
ee.on ( 'some_events', 청취자);
ee.on ( 'some_events', Listener2);
ee.on ( 'Other_Events', 함수 (foo, bar)
{
Console.log ( "기타 청취 이벤트, 파라미터 foo =" + foo + ", bar =" + bar);
});
/*
eventItter.listeners (이벤트) // 지정된 이벤트의 청취 배열을 반환합니다
매개 변수 1 : 이벤트 문자열, 이벤트 이름
*/
var listenEreventSar = ee.listeners ( 'some_events');
Console.log (ListenEreventSarr.length)
for (var i = ListenEreventSarr.length-1; i> = 0; i-) {
Console.log (ListenEreventSarr [i]);
};
Emitter.listeners (이벤트) 샘플 소스 코드
some_events에 대해 두 명의 청취자를 등록하고, Emitter.listeners 기능을 호출하고, some_events 이벤트 이름을 전달하고, 기능 반환 값을받습니다.
결과에서, 우리는 반환 값이 some_events에 대한 등록 된 모든 청취의 컬렉션을받는 것을 알 수 있습니다!
Emitter.SetMaxListeners (N)
하나의 이벤트가 여러 청취자를 추가 할 수 있다는 것은 사실이지만 NodeJS의 기본 최대 값은 얼마입니까?
코드 사본은 다음과 같습니다.
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
/*
Eventemitter에 11 명의 리스너를 추가하십시오
*/
for (var i = 10; i> = 0; i-) {
ee.on ( 'some_events', function ()
{
console.log ( 'th' +(i +1) +'리스너');
});
};
듣기 샘플 소스 코드를 추가하십시오
위의 예에서는 루프를 사용하여 11을 추가하여 일부 _events를 듣고 코드를 실행하고 경고 정보가 나타나고 프롬프트가 더 상세하다는 것을 알았으므로 Emitter.setMaxListeners ()를 사용해야합니다.
코드 사본은 다음과 같습니다.
var eventimitter = require ( 'events'). Eventemitter;
var ee = new Eventemitter ();
/*
eventItter.setMaxListeners (n) 이벤트 미터에 대한 최대 청취를 설정합니다
매개 변수 1 : N 번호 유형, 최대 리스너 수
청취자가 10 명 이상 있으면 이벤트 미터의 최대 청취자 수가 촉진됩니다.
(노드) 경고 : 가능한 이벤트 메모리 누출이 감지되었습니다. 11 청취자가 추가되었습니다.
imitter.setMaxListeners ()를 사용하여 제한을 늘리십시오.
디자이너는 너무 많은 청취자가 메모리 누출로 이어질 수 있다고 생각하므로 그러한 경고가 있습니다.
*/
ee.setmaxlisteners (15);
/*
Eventemitter에 11 명의 리스너를 추가하십시오
*/
for (var i = 10; i> = 0; i-) {
ee.on ( 'some_events', function ()
{
console.log ( 'th' +(i +1) +'리스너');
});
};
Emitter.SetMaxListeners 샘플 소스 코드
Emitter.setMaxListeners가 15로 통과 할 때 코드가 실행되고 경고 정보가 더 이상 나타나지 않습니다.
Emitter.setMaxListeners의 기능은 Eventemitter의 최대 리스너 수를 설정하는 것입니다. 이 값을 설정할 필요가없는 것 같습니다. 10이 충분하지 않은 경우가 더 적어야합니다!
디자이너는 너무 많은 청취자가 메모리 누출을 일으킬 것이라고 생각했기 때문에 경고를했습니다!
다른...
덜 사용하면 세부 사항으로 들어 가지 않을 것입니다
eventItter.DefaultMaxListeners
eventItter.defaultMaxListeners 함수는 setMaxListeners와 유사합니다.
모든 이벤트 메미터에 대한 최대 청취를 설정하십시오
setMaxListeners 우선 순위는 DefaultMaxListeners보다 큽니다
eventItter.listenercount (이미 터, 이벤트)
지정된 이벤트의 리스너 수를 반환합니다
특별 이벤트 오류
Node.js Development Guide의 인용문 : EventeMitter는 "오류"의 의미를 포함하는 특수 이벤트 오류를 정의합니다. 우리는 보통 예외를 발견 할 때 오류 이벤트를 발생시킵니다. 오류가 방출되면 EventeMitter는 응답 리스너가 없으면 Node.js는이를 예외로 처리하고 프로그램을 종료하고 통화 스택을 인쇄하도록 지정합니다. 우리는 일반적으로 오류가 발생한 후 전체 프로그램이 충돌하지 않도록 오류 이벤트를 방출하는 객체에 대한 리스너를 설정해야합니다.
사건의 상속
나중에 Util에서 그것에 대해 이야기합시다. 관심이 있으시면 직접 확인할 수 있습니다.