Node.js의 이벤트 드라이버와 EventEmitter 클래스에 대해 이야기해 보겠습니다.
이 기사는 Node의 이벤트를 이해하고 이벤트 드라이버와 EventEmitter 클래스에 대해 이야기하는 데 도움이 될 것입니다.
Nodejs는 단일 프로세스 단일 스레드 애플리케이션이지만 V8 엔진에서 제공하는 비동기 실행 콜백 인터페이스 때문에 이러한 인터페이스를 통해 많은 양의 동시성을 처리할 수 있으므로 성능이 매우 높습니다. .
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');
Instance
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); } })
接下来让我们执行以上代码:
EventEmitter 类
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다음으로 위 코드를 실행해 보겠습니다.
EventEmitter 클래스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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Non-Blocking, Event-Driven 기반으로 구축된 Node 서비스는 메모리 소모가 적다는 장점이 있으며, 대규모 네트워크 요청을 처리하는데 매우 적합합니다. 대규모 요청을 전제로 '메모리 제어'와 관련된 문제를 고려해야 합니다. 1. V8의 가비지 수집 메커니즘과 메모리 제한 Js는 가비지 수집 기계에 의해 제어됩니다.

이 기사는 NodeJS V8 엔진의 메모리 및 가비지 수집기(GC)에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.
![이벤트 ID 4660: 개체가 삭제되었습니다. [수정]](https://img.php.cn/upload/article/000/887/227/168834320512143.png?x-oss-process=image/resize,m_fill,h_207,w_330)
독자 중 일부는 이벤트 ID4660을 경험했습니다. 그들은 무엇을 해야 할지 확신하지 못하는 경우가 많으므로 이 가이드에서 이에 대해 설명합니다. 이벤트 ID 4660은 일반적으로 개체가 삭제될 때 기록되므로 컴퓨터에서 이 문제를 해결할 수 있는 몇 가지 실용적인 방법도 살펴보겠습니다. 이벤트 ID4660이란 무엇입니까? 이벤트 ID 4660은 Active Directory의 개체와 관련되어 있으며 다음 요소에 의해 트리거됩니다. 개체 삭제 – Active Directory에서 개체가 삭제될 때마다 이벤트 ID 4660이 포함된 보안 이벤트가 기록됩니다. 수동 변경 - 사용자 또는 관리자가 개체의 사용 권한을 수동으로 변경할 때 이벤트 ID 4660이 생성될 수 있습니다. 이는 권한 설정을 변경하거나, 액세스 수준을 수정하거나, 사람이나 그룹을 추가 또는 제거할 때 발생할 수 있습니다.

파일 모듈은 파일 읽기/쓰기/열기/닫기/삭제 추가 등과 같은 기본 파일 작업을 캡슐화한 것입니다. 파일 모듈의 가장 큰 특징은 모든 메소드가 **동기** 및 ** 두 가지 버전을 제공한다는 것입니다. 비동기**, sync 접미사가 있는 메서드는 모두 동기화 메서드이고, 없는 메서드는 모두 이기종 메서드입니다.

iOS 16 이상을 실행하는 iPhone에서는 예정된 캘린더 이벤트를 잠금 화면에 직접 표시할 수 있습니다. 이 작업이 어떻게 수행되었는지 알아보려면 계속 읽어보세요. 시계 페이스 컴플리케이션 덕분에 많은 Apple Watch 사용자는 손목을 통해 다음 캘린더 이벤트를 확인하는 데 익숙합니다. iOS16 및 잠금 화면 위젯의 등장으로 기기 잠금을 해제하지 않고도 iPhone에서 직접 동일한 캘린더 이벤트 정보를 볼 수 있습니다. 캘린더 잠금 화면 위젯은 두 가지 형태로 제공되며, 다음 예정된 이벤트 시간을 추적하거나 이벤트 이름과 시간을 표시하는 더 큰 위젯을 사용할 수 있습니다. 위젯 추가를 시작하려면 Face ID 또는 Touch ID를 사용하여 iPhone을 잠금 해제하고 길게 누르세요.

이벤트 루프는 Node.js의 기본 부분이며 메인 스레드가 차단되지 않도록 하여 비동기 프로그래밍을 가능하게 합니다. 이벤트 루프를 이해하는 것은 효율적인 애플리케이션을 구축하는 데 중요합니다. 다음 기사는 Node.js의 이벤트 루프에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

초기에 JS는 브라우저 측에서만 실행되었습니다. 유니코드로 인코딩된 문자열은 처리하기 쉬웠지만 바이너리 및 유니코드가 아닌 인코딩된 문자열을 처리하는 것은 어려웠습니다. 그리고 바이너리는 컴퓨터의 가장 낮은 데이터 형식인 비디오/오디오/프로그램/네트워크 패키지입니다.

프론트 엔드 애플리케이션 개발에 Node.js를 사용하는 방법은 무엇입니까? 다음 기사에서는 프레젠테이션 계층 애플리케이션 개발과 관련된 Node에서 프런트 엔드 애플리케이션을 개발하는 방법을 소개합니다. 오늘 제가 공유한 솔루션은 간단한 시나리오를 위한 것입니다. 이는 프런트 엔드 개발자가 코딩이 없더라도 Node.js에 대한 배경 지식과 전문 지식을 너무 많이 습득하지 않고도 간단한 서버 측 개발 작업을 완료할 수 있도록 설계되었습니다. 경험.
