首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Node.js EventEmitter 事件处理详解

Node.js 核心部分是事件驱动,有许多诸如文件系统(fs)和 stream 这样模块本身都是用 EventEmitter 编写。...我们可以把事件驱动程序看作是发布-订阅模型,其中发布者触发事件订阅者侦听事件并采取相应措施。 例如,假设有一个服务器,用户可以向其上传图片。...对象(“监听器”)” ❞ 这个类在某种程度上可以描述为发布-订阅模型辅助工具实现,因为它可以用简单方法帮助事件发送器(发布者)发布事件(消息)给监听器(订阅者)。...,则新事件也会添加到数组中。 这个方法不会返回已发布事件,而是返回订阅事件列表。...如果 EventEmitter 发出了 error 事件,但是没有订阅订阅 error 事件,那么 Node.js 程序将会抛出这个 Error。

1.5K20

发布订阅模式入手读懂Node.jsEventEmitter源码

发布订阅模式在面试中也是高频考点,本文会自己实现一个发布订阅模式,弄懂了他原理后,我们就可以去读Node.jsEventEmitter源码,这也是一个典型发布订阅模式。...消息中心:负责存储消息与订阅对应关系,有消息触发时,负责通知订阅订阅者:去消息中心订阅自己感兴趣消息 发布者:满足条件时,通过消息中心发布消息 有了这种模式,前面处理几个相互依赖异步API就不用陷入...('request3Success'); } }); }) 复制代码 Node.jsEventEmitter Node.jsEventEmitter思想跟我们前面的例子是一样,不过他有更多错误处理和更多...发布事件 代码传送门:github.com/nodejs/node… EventEmitter发布事件API是emit,这个API里面会对"error"类型事件进行特殊处理,也就是抛出错误: ?...在了解了原理后,还去读了Node.jsEventEmitter模块源码,进一步学习了生产环境发布订阅模式写法。

87831
您找到你想要的搜索结果了吗?
是的
没有找到

小程序中发布订阅事件一次优化

项目背景 普通发布订阅方法在这里就不进行解释了,相信百度一下有一堆。...在我们自己小程序中,很早之前就使用了发布订阅模式来管理城市和登录态切换,但是在小程序中会存在非常一些问题 页面注销后订阅事件不会销毁 使用my.reLaunch或my.switchTab跳转会清空页面栈...,重新进入带有订阅事件页面缓存列表会再push一次订阅事件,造成一次发布多次订阅bug 想要手动销毁订阅事件必须在注册订阅事件时使用具名函数,然后在onUnload中销毁 举个最简单例子,我们在A...订阅事件可以使用匿名函数 页面注销自动销毁订阅事件 实现一个简单发布订阅 // broadcast.js class Emitter{ constructor() { // 存储所有订阅事件...return出销毁事件关联起来,这时就可以做一层简单拦截,统一处理 // 重新创建一个实例对订阅方法做一层拦截,得到如上数据 class Broadcast{ on(name, callback

65051

深入学习 Node.js EventEmitter

换句话说,发布/订阅模式用来处理不同系统组件信息交流,即使这些组件不知道对方存在。 那么信息中介是如何过滤消息呢?在发布/订阅模型中,订阅者通常接收所有发布消息一个子集。...观察者模式 vs 发布/订阅模式 ?...Node.js EventEmitter 大多数 Node.js 核心 API 都采用惯用异步事件驱动架构,其中某些类型对象(触发器)会周期性地触发命名事件来调用函数对象(监听器)。...,那么内部处理程序会先根据 listener 事件处理器,查找该事件处理器对应索引值,若该索引值大于 0,则会调用 Node.js 内部工具库提供 spliceOne() 方法,移除对应事件处理器...EventEmitter once() 方法 有些时候,对于一些特殊事件类型,我们只需执行一次事件处理器,这时我们就可以使用 once() 方法: const myEmitter = new MyEmitter

1K30

实现一个 EventEmitter

最常见发布订阅模式莫过于给 DOM 绑定事件,当点击一个按钮或者鼠标移动到某个元素上就会触发事件监听函数,然后弹出一个文本框或者改变元素样式。...在 Node.js 中,也大量应用了发布订阅模式,它是构成 Node.js 平台核心之一。...,Node.js 中利用发布订阅模式可以处理请求数据。...这些发布订阅模式都是内置,在 Node.js 中,有一个 events 模块,这个模块中有一个 EventEmitter 类,EventEmitter 可以将一个或多个函数注册为监听器,当事件触发时,...Node.js许多模块都继承了这个类,拥有了事件监听能力。 EventEmitter 内部维护着一个事件监听函数集,当内部方法 emit 被调用后就会触发相应监听函数。

1.3K10

一文彻底搞懂Events模块

模拟实现 Node.js 核心模块 Events 发布/订阅者模式 发布/订阅者模式应该是我在开发过程中遇到最多设计模式。...EventEmitter发布/订阅模式关系 Node.js EventEmitter 模块就是用了发布/订阅这种设计模式,发布/订阅 模式在主体与观察者之间引入消息调度中心,主体和观察者之间完全透明...它核心思想就是 Events 模块功能就是一个 事件绑定与触发,所有继承自它实例都具备事件处理能力。...,用于remove时判断 only.origin = listener; this.on(type, only); }; once方法非常有趣,它功能是将事件订阅一次”,当这个事件触发过就不会再次触发了...事件触发 事件触发,我们只需要关注图中第三部分,事件循环会在事件队列中取出事件处理

92820

node事件模块应用(译)

就像前端javascript一样,你可以通过addEventListener来绑定用户鼠标键盘交互事件EventEmitter是基于发布订阅模式,因此我们可以通过订阅事件然后再发布。...我们可以看到很多前端javascript库是支持订阅发布模式,但Node.js是内建。 有一个重要问题:你为什么要使用事件模式?因为在Node.js里,他可以替代各种深层嵌套加调。...其实一个事件不止被监听一次,还可一个事件被监听多次,并且当事件被触发时,所有监听者事件都会被触发。默认情况下,Node.js允许一个事件同时被监听10次。如果再创建Node.js会发出警告。...其他 EventEmitter 方法 还有其他非常有用 EventEmitter方法 once, 像on方法,不同是它适用于一次,被触发一次后,监听者会被删除。...,并用它们来处理内部事件

42810

TS 设计模式08 - 发布订阅模式

= this.events.get(type) || []; const { handler, once } = handlers[i]; // 如果是一次...小结 发布订阅模式可以说是对观察者模式进一步抽象。...我们通过消息中心对消息进行统一处理,那么这里通知者和消费者关系其实被弱化了,它们可以是任意对象,通知者和消费者也可以是同一个对象,这种模式甚至在非对象也可以使用,即我们只关注发布订阅行为本身,而不关心发布订阅者是谁...参考 从发布订阅模式入手读懂Node.jsEventEmitter源码 使用typescript 写一个简单事件监听/发布订阅模式类 TypeScript 设计模式之发布-订阅模式 观察者模式和发布订阅模式区别...图解23种设计模式(TypeScript版)——前端必修内功心法 观察者模式 vs 发布订阅模式 设计模式之发布订阅模式(1) 一文搞懂发布订阅模式 github - node/lib/events

1.1K20

如何优雅实现消息通信?

Node.js 中有一个名为 events 内置模块,通过它我们可以方便地实现一个自定义事件派发器,比如: const EventEmitter = require('events'); class...接下来阿宝哥将介绍如何利用 Redis 提供发布订阅功能实现系统间通信,不过在介绍具体应用前,我们得先熟悉一下 Redis 提供发布订阅功能。...3.3.1 Redis 发布订阅功能 Redis 订阅功能 通过 Redis subscribe 命令,我们可以订阅感兴趣通道,其语法为:SUBSCRIBE channel [channel …...3.3.2 实现不同系统间通信 这里我们使用 Node.js Express 框架和 redis 模块来快速搭建不同 Web 应用,首先创建一个新 Web 项目并安装一下相关依赖: $ npm...到这里发布订阅模式应用场景,已经介绍完了。最后,阿宝哥来介绍一下如何使用 TS 实现一个支持发布订阅功能 EventEmitter 组件。

1.5K50

一文彻底搞懂Events模块

模拟实现 Node.js 核心模块 Events 发布/订阅者模式 发布/订阅者模式应该是我在开发过程中遇到最多设计模式。...EventEmitter发布/订阅模式关系 Node.js EventEmitter 模块就是用了发布/订阅这种设计模式,发布/订阅 模式在主体与观察者之间引入消息调度中心,主体和观察者之间完全透明...它核心思想就是 Events 模块功能就是一个 事件绑定与触发,所有继承自它实例都具备事件处理能力。...,用于remove时判断 only.origin = listener; this.on(type, only); }; once方法非常有趣,它功能是将事件订阅一次”,当这个事件触发过就不会再次触发了...事件触发 事件触发,我们只需要关注图中第三部分,事件循环会在事件队列中取出事件处理

85131

Node.js 知名框架 Express Koa 都在使用 Events 模块你了解吗?

——塞涅卡 在 Node.js 中一个很重要模块 Events(EventEmitter 事件触发器),也称为发布/订阅模式,为什么说它重要,因为在 Node.js 中绝大多数模块都依赖于此,例如 Net...事件是否等价于异步? 先从一个简单例子开始 事件驱动是 Node.js 核心,怎么体现事件驱动呢?...通常一种最常见形式就是回调,触发一次事件,然后通过回调来接收一些处理,关于这种形式在 JavaScript 编程中屡见不鲜,例如 fs.readFile(path, callback)、TCP 中...最后一个最重要错误处理,在 Node.js 中错误处理是一个需要重视事情,一旦抛出一个错误没有人为处理,可能造成结果是进程自动退出,如下代码因为事件触发器带有错误信息,而没有相应错误监听在,会导致进程退出...EventEmitter 本质上就是观察者模式实现,一个类似的模式是发布/订阅,生产者将消息发布之后无需关心订阅实现,关注过Nodejs技术栈公众号同学,也许你会收到过我之前发布 RabbitMQ

1.9K41

Node.js 流源码解读之可读流

两种读取模式: 流动模式:数据会从底层系统读取,并通过 EventEmitter 尽快将数据传递给所注册事件处理程序中 暂停模式:在这种模式下将不会读取数据,必须显示调用 Stream.read...对于这个问题而言,首先要了解什么是发布订阅模式,发布订阅模式在大多数 API 中都有重要应用,无论是 Promise 还是 Redux,基于发布订阅模式实现高级 API 随处可见。...它优点在于能将事件相关回调函数存储到队列中,然后在将来某个时刻通知到对方去处理数据,从而做到关注点分离,生产者只管生产数据和通知消费者,而消费者则只管处理对应事件及其对应数据,而 Node.js...那么 Node.js 流是怎样实现基于 EventEmitter 创建实例呢?...注:此处解读 Node.js 可读流源码中所声明函数,不包含外部引入函数定义,同时为了减少篇幅,不会将所有代码都拷贝下来。

2.1K10

JS 和 Node.js事件驱动”是什么意思?

事件驱动和发布-订阅 事件驱动架构是建立在软件开发中一种通用模式上,这种模式被称为发布-订阅或观察者模式。 在事件驱动架构中,至少有两个参与者:主题(subject)和观察者(observer)。...请记住,事件驱动、发布-订阅和观察者模式在实践中不是一回事,但在理想情况下,它们使用相同方法:一个实体广播一条消息,其他实体侦听该消息。 发布-订阅模式和我一样老。...但是那些 on 方法从哪里来呢? 了解 EventEmitter Node.js所有事件驱动模块都扩展了一个名为 EventEmitter 根类。...你学到了很多术语,但最终都归结为大约 30 年前发明模式:发布-订阅。 这种模式,也称为观察者,是我们今天在 JavaScript 和 Node.js 中所使用事件驱动架构基础。...再次强调,事件驱动、发布-订阅和观察者模式并非完全相同:事件驱动体系结构建立在发布-订阅之上,观察者模式比 DOM 和 Node.js 事件更丰富。 但他们都是属于同一个家庭成员。

8.4K20

js发布订阅

发布-订阅模式,看似陌生,其实不然。工作中经常会用到,例如 Node.js EventEmitter on 和 emit 方法;Vue 中 on 和 emit 方法。...订阅者(Subscriber)把自己想订阅事件注册(Subscribe)到调度中心(Event Channel),当发布者(Publisher)发布事件(Publish Event)到调度中心,也就是该事件触发时...上面一个看似简单操作,其实是一个典型发布订阅模式,公众号属于发布者,用户属于订阅者;用户将订阅公众号事件注册到调度中心,公众号作为发布者,当有新文章发布时,公众号发布事件到调度中心,调度中心会及时发消息告知用户...,根据 event 值去执行对应缓存列表中函数(发布发布事件到调度中心,调度中心处理代码) off 方法可以根据 event 值取消订阅(取消订阅) once 方法只监听一次,调用完毕后删除缓存函数...)到调度中心,也就是该事件触发时,由调度中心统一调度(Fire Event)订阅者注册到调度中心处理代码。

1.5K20

nodejs v14源码分析之event模块

events模块是Node.js中比较简单但是却非常核心模块,Node.js中,很多模块都继承于events模块,events模块是发布订阅模式实现。我们首先看一下如何使用events模块。...2 订阅事件 初始化完EventEmitter之后,我们就可以开始使用订阅发布功能。我们可以通过addListener、prependListener、on、once订阅事件。...addListener和on是等价,prependListener区别在于处理函数会被插入到队首,而默认是追加到队尾。once注册处理函数,最多被执行一次。...3 触发事件 分析完事件订阅,接着我们看一下事件触发。 1....return true; 81. } 我们看到在Node.js中,对于error事件是特殊处理,如果用户没有注册error事件处理函数,可能会导致程序挂掉,另外我们看到有一个addCatch

31900

《深入浅出Node.js》:Node异步编程解决方案 之 事件发布-订阅模式

《深入浅出Node.js》书中异步编程解决方案主要有三种:事件发布-订阅模式、Promise/Deferred模式、流程控制库。...事件发布-订阅模式 首先看事件发布-订阅模式,事件发布-订阅模式也叫观察者模式或者事件监听器模式,是一种广泛用于异步编程设计模式,是回调函数事件化。...监听器可以很灵活添加和删除,使得事件和具体处理逻辑之间很轻松关联与解耦。 事件发布-订阅模式自身没有同步和异步调用问题。...在一些典型场景中,可以通过事件发布-订阅模式进行组件封装,将不变部分封装在组件内部,将容易变化、需自定义部分通过事件暴露给外部处理,就是一种典型逻辑分离方式。...2.利用事件队列解决雪崩问题 在事件发布-订阅模式中,除了on()方法还有一个once()方法,通过它添加监听器只能执行一次,在执行之后就会将它与事件关联移除。

1.3K30

如果面试官让你讲讲发布订阅设计模式?

最近在程序中使用到了 eventEmitter3 这个事件发布订阅库,该库可用于组件之间通信管理,通过简单 Readme 文档可学会如何使用,但同时了解这个库设计也有助于大家了解认识发布订阅设计模式...2.2 支持只订阅一次once方法 在一些场景下,某些事件订阅可能只需要执行一次,后续通知将不再响应。...三、学习EventEmitter3设计实现 虽然我们按照自己理解实现了一版,但是没有对比我们也不知道好坏,因此一起看看 EventEmitter3 这个优秀“极致性能优化”库是怎么去处理事件订阅发布...* @param {*} context 调用侦听器上下文. * @param {Boolean} once 指定侦听器是否支持调用一次....四、总结 EventEmitter3 是一个号称优化到极致事件发布订阅工具库,通过梳理可知晓: call 与 apply 在效率上差异 对象和对象数组存取性能考虑 理解发布订阅模式,以及在事件系统中应用实例

2.7K30

【前端面试题】—53道常见NodeJS基础面试题(附答案)

8、Node. js中事件循环是什么样事件循环其实就是一个事件队列,先加入先执行,执行完一次队列,再次循环遍历看有没有新事件加入队列。...Node.js是单线程,异步是通过一次循环事件队列来实现。同步则是阻塞式IO,这在高并发环境中会是一个很大性能问题,所以同步一般只在基础框架启动时使用,用来加载配置文件、初始化程序等。...EventEmitter是 Node. js中一个实现观察者模式类,主要功能是订阅发布消息,用于解决多模块交互而产生模块之间耦合问题. 23、如何实现一个 EventEmitter?...(3)处理流数据,因为流是在 EventEmitter基础上实现。 (4)运用观察者模式收发消息相关应用。 25、如何捕获 EventEmitter错误事件?...29、如何捕获流错误事件? 监听error事件,方法与订阅 EventEmittererror事件相似。 30、有哪些常用 Stream流?分别什么时候使用?

51630

分享 1个原生 JS 瀑布流案例

使用发布-订阅模式和继承实现监听绑定 既然以开发插件为目标,不能仅仅满足于功能实现,还要留出相应操作空间给开发者自行处理。.../订阅模式来实现它,关于发布/订阅模式,之前在Node.js 异步异闻录 有介绍它。...其核心思想即通过订阅函数将函数添加到缓存中,然后通过发布函数实现异步调用,下面给出其代码实现: function eventEmitter() { this.sub = {} } eventEmitter.prototype.on...} } 接着,要让 Waterfall 能使用发布/订阅模式,只需让 Waterfall 继承 eventEmitter 函数,代码实现如下: function Waterfall(options...() { if (isLoading) return false // 避免一次触发事件多次 if (scrollPX + bsHeight > imgList[imgList.length

1.9K20
领券