이 기사는 Node의 이벤트를 이해하고 이벤트 드라이버와 EventEmitter 클래스에 대해 이야기하는 데 도움이 될 것입니다.
Node.js의 거의 모든 API는 콜백 기능을 지원합니다.
Node.js 기본적으로 모든 이벤트 메커니즘은 디자인 패턴에서 관찰자 패턴을 사용하여 구현됩니다.
Node.js 단일 스레드는 이벤트 관찰자가 종료되지 않을 때까지 while(true) 이벤트 루프를 입력하는 것과 유사합니다. 이벤트가 발생하면 콜백 함수가 호출됩니다.
Node.js는 이벤트 중심 모델을 사용합니다. 웹 서버는 요청을 받으면 요청을 닫고 처리한 후 다음 웹 요청을 처리합니다.
이 요청이 완료되면 다시 처리 대기열로 들어가고, 대기열의 시작 부분에 도달하면 결과가 사용자에게 반환됩니다.
이 모델은 웹 서버가 읽기 또는 쓰기 작업을 기다리지 않고 항상 요청을 수락하기 때문에 매우 효율적이고 확장 가능합니다. (이것을 Non-Blocking IO 또는 Event-Driven IO라고도 합니다.)
Event-Driven 모델에서는 이벤트를 수신하기 위해 메인 루프가 생성되고, 이벤트가 감지되면 콜백 함수가 트리거됩니다.
Node.js에는 다음 예제와 같이 이벤트 모듈을 도입하고 EventEmitter 클래스를 인스턴스화하여 이벤트를 바인딩하고 수신할 수 있습니다.
// 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter();
다음 프로그램은 이벤트 핸들러를 바인딩합니다.
// 绑定事件及事件的处理程序 eventEmitter.on('eventName', eventHandler);
us 이벤트는 프로그래밍 방식으로 트리거될 수 있습니다:
// 触发事件 eventEmitter.emit('eventName');
index.js
파일을 생성합니다. 코드는 다음과 같습니다: index.js
文件,代码如下所示:
//引入 fs 模块 var fs = require("fs"); // 引入 events 模块 var events = require('events'); // 创建对象 var ee = new events.EventEmitter(); // 绑定事件及事件的处理程序 ee.on('res', function (data) { console.log('res-1'); console.log(data); }); ee.on('res', function () { console.log('res-2'); }); fs.readFile('hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){ if(err){ console.log("读取出错:"+err); }else{ console.log("读取成功:"+data); // 触发res事件 ee.emit('res',data); } })
接下来让我们执行以上代码:
events
模块只提供了一个对象: events.EventEmitter
。EventEmitter
的核心就是事件触发与事件监听器功能的封装。
你可以通过require("events");来访问该模块。
// 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter();
EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,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);
执行结果如下:
运行这段代码,1 秒后控制台输出了 'some_event 事件触发' 。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用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 参数
以上例子中,emitter
为事件 someEvent
注册了两个事件监听器,然后触发了 someEvent
事件。
运行结果中可以看到两个事件监听器回调函数被先后调用。 这就是EventEmitter
最简单的用法。
EventEmitter
rrreee다음으로 위 코드를 실행해 보겠습니다.
events
모듈은 events.EventEmitter
라는 하나의 객체만 제공합니다. EventEmitter
의 핵심은 이벤트 트리거링 및 이벤트 리스너 기능을 캡슐화하는 것입니다. require("events");를 통해 이 모듈에 액세스할 수 있습니다. rrreeeEventEmitter 객체는 인스턴스화 중에 오류가 발생하면 오류 이벤트를 트리거합니다. newListener 이벤트는 새 리스너가 추가될 때 시작되고, RemoveListener 이벤트는 리스너가 제거될 때 시작됩니다.
🎜 아래에서는 EventEmitter의 사용법을 설명하기 위해 간단한 예를 사용합니다. 🎜rrreee🎜실행 결과는 다음과 같습니다. 🎜🎜이 코드를 실행하고 1초 후에 콘솔 출력 🎜'some_event 이벤트가 트리거됨'🎜. 원칙은 이벤트 객체가 some_event 이벤트에 대한 리스너를 등록한 다음 setTimeout을 사용하여 1000밀리초 후에 이벤트 객체에 some_event 이벤트를 보내는 것입니다. 이때 some_event에 대한 리스너가 호출됩니다. 🎜rrreee🎜EventEmitter
의 각 이벤트는 이벤트 이름과 여러 매개변수로 구성되며 일반적으로 특정 의미를 표현합니다. 각 이벤트에 대해 EventEmitter
는 여러 이벤트 리스너를 지원합니다. 🎜🎜이벤트가 발생하면 해당 이벤트에 등록된 이벤트 리스너가 순차적으로 호출되고, 이벤트 매개변수가 콜백 함수 매개변수로 전달됩니다. 🎜🎜이 프로세스를 다음 예를 통해 설명하겠습니다. 🎜rrreee🎜위 코드를 실행하면 실행 결과는 다음과 같습니다. 🎜rrreee🎜위 예에서 emitter
는 이벤트에 등록됩니다. >someEvent
두 개의 이벤트 리스너가 생성된 후 someEvent
이벤트가 트리거됩니다. 🎜🎜실행 결과에서 두 개의 이벤트 리스너 콜백 함수가 연속적으로 호출되는 것을 볼 수 있습니다. 이는 EventEmitter
의 가장 간단한 사용법입니다. 🎜🎜EventEmitter
는 🎜on🎜 및 🎜emit🎜과 같은 여러 속성을 제공합니다. 🎜on🎜 함수는 이벤트 함수를 바인딩하는 데 사용되고 🎜emit🎜 속성은 이벤트를 트리거하는 데 사용됩니다. 🎜🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! ! 🎜위 내용은 Node.js의 이벤트 드라이버와 EventEmitter 클래스에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!