이 글은 Node.js의 이벤트 모듈을 이해하고 이벤트의 게시 및 구독 모델을 소개하는 데 도움이 될 것입니다.
이벤트 모듈
참조 공식 웹사이트: 이벤트 이벤트 트리거 | Node.js
http://nodejs.cn/api/events.html
이벤트
모듈 Node의 가장 중요한 모듈입니다. EventEmitter
속성을 제공합니다. EventEmitter
의 핵심은 이벤트 방출과 이벤트 리스너입니다. Events
模块是Node最重要的模块,它提供了一个属性 EventEmitter
,EventEmitter
的核心是事件发射与事件监听器。
Node中大部分的模块,都继承自 Events
模块。
-
Events
模块是Node对 发布订阅模式(publish/subscribe
)的实现。一个对象通过这个模块,向另一个对象传递消息。 - 该模块通过
EventEmitter
属性,提供了一个构造函数。该构造函数的实例具有on
方法,可以用来监听指定事件,并触发回调函数。 - 任意对象都可以发布指定事件,被
EventEmitter
实例的on方法监听到。
发布订阅模式
关于 发布订阅模式 ,可以参考我之前的博客文章。
关于 Events
中的发布订阅模式,我们要先清楚它的几个常用方法。
-
订阅方法:
on
方法用来订阅事件,订阅是将方法对应成一种一对多的关系。 -
发布方法:
emit
用来执行订阅的事件。 -
取消订阅:
off
方法可以移除对应的事件监听。 -
订阅一次:
once
绑定事件当执行后自动删除订阅的事件。
on 和 emit
on
方法的第一个参数用来设定类名,第二个参数也是一个函数,里面可以接收发布时传入的参数。
emit
方法第一个参数是类名,之后的参数都是传入 on
方法函数中的参数。
on
和 emit
具体应用可以参考下面这个简单的Demo。
const EventEmitter = require('events'); // 自定义一个 构造函数 function Cat() {} // 原型继承 需要通过实例来调用继承方法 Object.setPrototypeOf(Cat.prototype, EventEmitter.prototype); let cat = new Cat(); const sleep = (a, b) => { console.log(a, '睡'); }; const eat = (a, b) => { console.log(b, '吃'); }; cat.on('猫咪', sleep) cat.on('猫咪', eat) setTimeout(() => { // 小胡子 吃 // 小胖仙 睡 cat.emit('猫咪', '小胖仙', '小胡子') }, 1000);
现在我们可以实现一套 on
和 emit
方法。
function EventEmitter() { this._event = {} } // on 方法 EventEmitter.prototype.on = function (eventName, callBack) { if (!this._event) { this._event = {} } if (this._event[eventName]) { this._event[eventName].push(callBack) // 相当于 {eventName:[fn1,fn2]} } else { this._event[eventName] = [callBack]; // 相当于 {eventName:[fn1]} } } // emit 方法 EventEmitter.prototype.emit = function (eventName, ...args) { this._event[eventName].forEach(fn => { fn(...args) }); }
off
off
方法的第一个参数用来设定类名,第二个参数传入需要被移除的函数回调。
// ... setTimeout(() => { // 小胡子 吃 // 小胖仙 睡 cat.emit('猫咪', '小胖仙', '小胡子') cat.off('猫咪', sleep); // 小胡子 吃 cat.emit('猫咪', '小胖仙', '小胡子') }, 1000);
这样我们可以大概判断出来,移除掉和我们传入函数相同的函数,我们很快想到 filter 方法。
// off 方法 EventEmitter.prototype.off = function (eventName, callBack) { if (this._event && this._event[eventName]) { this._event[eventName] = this._event[eventName].filter( fn => fn !== callBack && fn.c !== callBack // fn.c参考下面的once方法实现 ) } }
once
once
方法的第一个参数用来设定类名,第二个参数传入只需要执行一次的函数回调。
// ... const demolition =() => { console.log('拆家'); } cat.once('猫咪', demolition) setTimeout(() => { // ...... 拆家 cat.emit('猫咪', '小胖仙', '小胡子') }, 1000);
这样我们可以根据之前实现的 on
和 off
来实现此方法。
// once 方法 EventEmitter.prototype.once = function (eventName, callBack) { const one = () => { callBack(); this.off(eventName, one); } this.on(eventName, one); }
看起来这个方法好像没有什么问题,执行起来也全都是正确的。
但是在一种特殊情况下的时候,还是出现了错误。
那种情况就是如果我们在执行 once
方法之前,就已经通过 off
方法将其移除了。
我们实现的方法就不能实现这个需求了,所以我们还需要对 once
方法进行一些修改 ( off
方法已经处理过了)。
添加一个自定义属性,用来对函数进行 “缓存” 。
EventEmitter.prototype.once = function (eventName, callBack) { const one = () => { // ... } one.c = callBack; // 自定义一个属性 // ... }
这样我们就实现了 once
Node에 있는 대부분의 모듈은 Events
모듈에서 상속됩니다.
-
이벤트
모듈은 Node에서
게시-구독 모델(게시/구독
)을 구현한 것입니다. 한 개체는 이 모듈을 통해 다른 개체에 메시지를 전달합니다. - 이 모듈은
EventEmitter
속성을 통해 생성자를 제공합니다. 이 생성자의 인스턴스에는 지정된 이벤트를 수신하고 콜백 함수를 트리거하는 데 사용할 수 있는on
메서드가 있습니다. - 모든 객체는
EventEmitter
인스턴스의 on 메서드로 모니터링되는 지정된 이벤트를 게시할 수 있습니다.
🎜모델 게시 및 구독🎜
🎜🎜모델 게시 및 구독🎜, 이전 블로그 기사를 참조할 수 있습니다. 🎜🎜🎜이벤트
의 게시 및 구독 모델과 관련하여 먼저 몇 가지 일반적인 방법을 이해해야 합니다. 🎜- 🎜구독 방법🎜:
on
방법은 이벤트를 구독하는 데 사용됩니다. 구독은 방법을 일대다 관계로 매핑합니다. - 🎜게시 방법🎜:
emit
은 구독된 이벤트를 실행하는 데 사용됩니다. - 🎜Unsubscribe🎜:
off
메소드는 해당 이벤트 리스너를 제거할 수 있습니다. - 🎜Subscribe Once🎜:
once
바인딩된 이벤트는 실행 후 구독된 이벤트를 자동으로 삭제합니다.
🎜on andemit🎜
🎜on
메소드의 첫 번째 매개변수는 클래스를 설정하는 데 사용됩니다. name 의 두 번째 매개변수도 함수이며 게시 시 전달된 매개변수를 받을 수 있습니다. 🎜🎜 emit
메소드의 첫 번째 매개변수는 클래스 이름이고, 후속 매개변수는 on
메소드 함수에 전달되는 매개변수입니다. 🎜🎜on
및 emit
특정 애플리케이션에 대해서는 아래의 간단한 데모를 참조하세요. 🎜rrreee🎜이제 on
및 emit
메서드 세트를 구현할 수 있습니다. 🎜rrreee🎜off🎜
🎜off
메소드의 첫 번째 매개변수는 클래스 이름을 설정하는 데 사용되고 두 번째 매개변수는 전달됩니다. 필요에 따라 제거된 함수 콜백입니다. 🎜rrreee🎜 이렇게 하면 우리가 전달한 함수와 동일한 함수를 대략적으로 판단하고 제거할 수 있습니다. 우리는 filter🎜 방법. 🎜rrreee🎜once🎜
🎜once
메소드의 첫 번째 매개변수는 클래스 이름을 설정하는 데 사용되고 두 번째 매개변수는 전달됩니다. 한 번만 실행해야 하는 함수 콜백입니다. 🎜rrreee🎜이렇게 하면 이전에 구현된 on
및 off
를 기반으로 이 메서드를 구현할 수 있습니다. 🎜rrreee🎜이 방법에는 문제가 없는 것 같고 모두 올바르게 실행된 것 같습니다. 🎜🎜그러나 특수한 상황에서는 여전히 오류가 발생했습니다. 🎜🎜그 상황은 once
메소드를 실행하기 전에 off
메소드를 통해 제거한 경우입니다. 🎜🎜우리가 구현한 방법은 이 요구 사항을 충족할 수 없으므로 여전히 once
방법을 일부 수정해야 합니다(off
방법은 이미 처리되었습니다). 🎜🎜함수를 "캐시"하려면 사용자 정의 속성을 추가하세요. 🎜rrreee🎜이런 식으로 once
메서드를 구현했습니다. 🎜🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! ! 🎜🎜위 내용은 이벤트 모듈에 대해 Node.js 학습 및 채팅의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

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

Dreamweaver Mac版
시각적 웹 개발 도구

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

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
