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

为什么取消订阅后不能在同一EventEmitter上重新订阅

取消订阅后不能在同一EventEmitter上重新订阅的原因是因为EventEmitter是一种发布-订阅模式的设计模式,它用于在应用程序中实现事件驱动的编程。在订阅事件时,订阅者将自己注册到EventEmitter上,以便在事件触发时接收通知。取消订阅则是将订阅者从EventEmitter上移除。

当取消订阅后,订阅者与EventEmitter之间的关联关系被断开,订阅者将不再接收到该事件的通知。这是因为EventEmitter内部维护了一个订阅者列表,用于存储订阅者的引用。取消订阅会从该列表中移除对应的订阅者引用,使其无法再接收到事件通知。

重新订阅需要重新建立订阅者与EventEmitter之间的关联关系,即将订阅者重新注册到EventEmitter上。但是在同一EventEmitter上重新订阅可能会导致重复注册的问题,因为EventEmitter并没有内置机制来检测重复注册。如果允许在取消订阅后直接重新订阅,可能会导致同一个订阅者多次接收到相同的事件通知,从而引发逻辑错误或产生意外的行为。

为了避免这种问题,通常建议在取消订阅后,如果需要重新订阅同一个事件,应该创建一个新的订阅者实例并将其注册到EventEmitter上。这样可以确保每个订阅者只接收到一次事件通知,避免了重复注册的问题。

总结起来,取消订阅后不能在同一EventEmitter上重新订阅是为了避免重复注册导致的逻辑错误和意外行为。如果需要重新订阅同一个事件,应该创建一个新的订阅者实例并将其注册到EventEmitter上。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

从发布订阅模式入手读懂Node.js的EventEmitter源码

发布订阅模式在面试中也是高频考点,本文会自己实现一个发布订阅模式,弄懂了他的原理,我们就可以去读Node.js的EventEmitter源码,这也是一个典型的发布订阅模式。...本文所有例子已经上传到GitHub,同一个repo下面还有我所有博文和例子: github.com/dennis-jian… 为什么要用发布订阅模式 在没有Promise之前,我们使用异步API的时候经常会使用回调...如果不是错误类型的事件,就把订阅的回调事件拿出来执行: image.png 取消订阅 代码传送门:github.com/nodejs/node… EventEmitter里面取消订阅的API是removeListener...EventEmitter取消订阅API不仅仅会删除对应的订阅,在删除还会emit一个removeListener事件来通知外界。这里也会对this....在了解了原理,还去读了Node.js的EventEmitter模块的源码,进一步学习了生产环境的发布订阅模式的写法。

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

    ); 输出 console 结果: DYBOY订阅收到了消息 第二个订阅的消息 第二个订阅的消息 那么第一版的支持订阅、发布、取消的“发布订阅事件中心”就OK了。...实现的思路:新增 once 订阅方法,当响应了对应“发布者消息”,则主动取消订阅当前执行的回调函数。..._events[evt]; } 清除事件,只需要使用 delete 关键字,删除对象的属性 另外这里一个很巧妙的地方在于,依赖事件计数器,如果计数器为0,则重新创建一个 Events 存储器指向 emitter...这样处理的原因是,call 方法比 apply 方法效率更高,相关比较验证讨论可参考《call和apply的性能对比》 到这基本 EventEmitter3 的实现就啃完了!...四、总结 EventEmitter3 是一个号称优化到极致的事件发布订阅的工具库,通过梳理可知晓: call 与 apply 在效率的差异 对象和对象数组的存取性能考虑 理解发布订阅模式,以及在事件系统中的应用实例

    2.7K30

    js发布订阅

    实现思路 创建一个对象 在该对象创建一个缓存列表(调度中心) on 方法用来把函数 fn 都加到缓存列表中(订阅者注册事件到调度中心) emit 方法取到 arguments 里第一个当做 event...,根据 event 值去执行对应缓存列表中的函数(发布者发布事件到调度中心,调度中心处理代码) off 方法可以根据 event 值取消订阅取消订阅) once 方法只监听一次,调用完毕删除缓存函数...article1', user3); // 取消user2方法的订阅 eventEmitter.off('article1', user2); eventEmitter.once('article2...发布-订阅模式 用户4订阅了: Javascript 观察者模式 */ 三、 Vue 中的实现 有了发布-订阅模式的知识,我们来看下 Vue 中怎么实现 on 和 emit 的方法,直接看源码...toArray(cbs) : cbs; // 只取回调函数,取 event var args = toArray(arguments, 1);

    1.6K20

    深入学习 Node.js EventEmitter

    订阅者 - 只需执行订阅操作,新版的期刊发布,就会主动收到通知,如果取消订阅,以后就不会再收到通知。...订阅者将收到其订阅的主题上的所有消息,并且所有订阅同一主题的订阅者将接收到同样的消息。发布者负责定义订阅者所订阅的消息类别。...所有能触发事件的对象都是 EventEmitter 类的实例。 这些对象开放了一个 eventEmitter.on() 函数,允许将一个或多个函数绑定到会被对象触发的命名事件。...当 EventEmitter 对象触发一个事件时,所有绑定在该事件的函数都被同步地调用。 监听器的返回值会被丢弃。...为什么直接利用 Array#splice() 方法呢?官方的回答是 spliceOne() 方法的执行速度比 Array#splice() 快大约 1.5 倍。

    1.1K30

    Vue3中如何自定义消息总线

    这种机制通常是将一个事件中心(或称为事件总线)挂载到Vue的全局对象,从而使得任何组件都可以方便地通过事件总线来发布或监听事件。...可扩展性:可以轻松地添加新的发布者和订阅者,而无需修改现有的代码。这使得系统能够灵活地适应不断变化的需求。 灵活性:支持多个订阅者同时订阅同一个事件,并且可以根据需要定制事件的处理方式。...取消订阅事件 定义一个 off 方法,用于取消订阅事件,代码如下: class EventEmitter { private events: EventsType = {} off(eventName...: CallbackType) { // 如果传callback,就清除所有事件 if (!...} } off 方法接收两个参数,第一个参数 eventName 为事件名称,第二个参数 callback 为回调函数,核心逻辑是遍历 eventName 参数 split 之后的数组对象(允许同时取消订阅多个事件

    14310

    发布订阅模式,在工作中它的能量超乎你的想象

    { fn.apply(this, arguments); }); }, remove(key, fn) { // 这回我们加入了取消订阅的方法...emit方法取到arguments里第一个当做key,根据key值去执行对应缓存列表中的函数 remove方法可以根据key值取消订阅 工作中的应用 插广告 先给大家看一个链接,在这个新闻转码页的项目中...讲真-这可是node的核心模块 用过node的朋友们,应该对这个模块陌生,可以说这个在node中真的是很重要的模块了,在使用后发现,这完全是个大写的发布订阅模式啊 简直是无所不在的存在啊,那么废话不再.../events'); let util = require('util'); function Girl() { } // Girl继承EventEmitter的方法 util.inherits(Girl...} // 好处是无杂质,继承原型链的东东 this.

    59850

    发布订阅模式,在工作中它的能量超乎你的想象

    { fn.apply(this, arguments); }); }, remove(key, fn) { // 这回我们加入了取消订阅的方法...emit方法取到arguments里第一个当做key,根据key值去执行对应缓存列表中的函数 remove方法可以根据key值取消订阅 工作中的应用 插广告 先给大家看一个链接,在这个新闻转码页的项目中...讲真-这可是node的核心模块 用过node的朋友们,应该对这个模块陌生,可以说这个在node中真的是很重要的模块了,在使用后发现,这完全是个大写的发布订阅模式啊 简直是无所不在的存在啊,那么废话不再.../events'); let util = require('util'); function Girl() { } // Girl继承EventEmitter的方法 util.inherits(Girl...} // 好处是无杂质,继承原型链的东东 this.

    37120

    实现一个 EventEmitter

    在前端开发中,经常会使用到发布订阅模式,发布订阅模式也被称为观察者模式。...最常见的发布订阅模式莫过于给 DOM 绑定事件,当点击一个按钮或者鼠标移动到某个元素就会触发事件监听函数,然后弹出一个文本框或者改变元素样式。...比如在响应 post 请求时,想要拿到数据,可以给请求对象绑定 data 事件用来接收回传的数据,数据接收完毕就会触发 end 事件,我们就可以在其中拿到完整的请求数据了。...这些发布订阅模式都是内置的,在 Node.js 中,有一个 events 模块,这个模块中有一个 EventEmitter 类,EventEmitter 可以将一个或多个函数注册为监听器,当事件触发时,...CustomEvent 构造函数接收两个参数,第一个是事件名称,第二个是一个配置参数,配置项有: bubbles 一个布尔值,表明该事件是否会冒泡; cancelable 一个布尔值,表明该事件是否可以被取消

    1.3K10

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

    回调函数的英语名字callback,直译过来就是"重新调用"。日常使用是最常见的,所以就不多介绍了。...const emitter = new events.EventEmitter(); // 订阅 event1命名事件,并给出当触发此命名事件时执行的回调函数 // 订阅回调函数执行同步模式 emitter.on...事件发布-订阅模式可以实现一个事件与多个回调函数的关联,这些回调函数又称事件监听器。通过emit()触发事件,消息就会立即传递给当前事件的所有监听器执行。...这种通过事件钩子的方式,可以使开发者不用关注组件是如何启动和执行的,只需关注在需要的事件点即可。...并且这两种方式是语义兼容的。

    1.3K30

    JavaScript 设计模式 —— 发布订阅模式

    在日常生活中,常见的发布订阅模式有:订阅号,用户关注订阅号,内容创作者在平台发布内容,平台遍历粉丝列表进行内容推送;销售中介,客户给销售人员留下了客户信息及联系方式,在新产品推出时,挨个给客户打电话进行推销...订阅者 Subscriber 订阅事件,并定义事件发布的操作,向信道中介发起订阅 发布 — 订阅模式的应用 在上面也介绍到了发布订阅模式在日常生活中以及前端开发工作中的使用场景,例如原生 DOM 事件...,暴露了订阅接口,开发者不需要反复查询该事件是否完成;异步编程的请求中,开发者无需轮询 HTTP 请求的状态,可以通过订阅请求的 success、error、update 等事件。...在编程风格,发布订阅模式让两个对象在松耦合的情况下建立联系,不再需要显式的将接口调用硬编码耦合进另一个对象,发布者和订阅者发生各自代码的变更都不会影响到对方,下面来看看前端开发最常见的发布订阅模式应用...key 将事件的发布和订阅进行隔离,实现通用的发布订阅模式 // 通用发布订阅模式 class EventEmitter { // 订阅者列表 subscriber = {}; //

    63210

    RxJS 入门到搬砖 之 Observable 和 Observer

    EventEmitter 共享副作用并且无论订阅者是否存在都立即触发相反,Observable 没有共享执行并且是惰性计算。 订阅一个 Observable 就是调用一个函数。...在库中,它们是不一样的,不过在实践中可以认为它们在概念是一样的。 这表示订阅调用不会在同一个 Observable 的多个 Observer 之间共享。...Observable 甚至维护一个 Observer 列表。 订阅调用只是一种启动 Observable 执行并将值或时间传递给该执行的 Observer 的方法。...Observer 的惰性计算。...subscription.unsubscribe(); 当我们使用 create() 创建 Observable 时,每个 Observable 都必须定义如何处理该执行的资源,如可以在函数 subscribe() 中返回自定义取消订阅函数来实现

    75220

    Node.js 的 EventEmitter 事件处理详解

    在触发上传事件订阅者可以通过向网站的管理员发电子邮件,让他们知道用户已上传照片并对此做出反应;另一个订阅者可能会收集有关操作的信息,并将其保存在数据库中。...(`程序已经运行了 ${time} 秒`); }); 通过 on() 方法创建侦听器,并传递事件名称来指定希望将侦听器附加到哪个事件。...在 update 事件,运行一个记录时间的方法。 on() 函数的第二个参数是一个回调,可以接受事件发出的附加数据。...如果 EventEmitter 发出了 error 事件,但是没有订阅订阅 error 事件,那么 Node.js 程序将会抛出这个 Error。...在发生错误时会发出 error 事件,把读取流通过管道传输到写入流时会发出 pipe 事件,从写入流中取消管道传输时,会发出 unpipe 事件。

    1.6K20

    如何优雅的实现消息通信?

    时间就这样过了半个月,小秦和小王都陆续找到了阿宝哥,说 “全栈修仙之路” 博客的 TS 文章都差不多学完了,他们有空的时候都会到 “全栈修仙之路” 博客查看是否有新发的 TS 文章。...他们觉得这样挺麻烦的,看能不能在阿宝哥发完新的 TS 文章之后,主动通知他们。 ? 好友提的建议,阿宝哥怎能拒绝呢?所以阿宝哥分别跟他们说:“我会给博客加个订阅的功能,功能发布,你填写一下邮箱地址。...topics) { this.c.set(topic, topics = []); } topics.push(...handlers); } // 取消订阅指定的主题...= new EventEmitter(); eventEmitter.subscribe("ts", (msg) => console.log(`收到订阅的消息:${msg}`) ); eventEmitter.publish...("ts", "TypeScript发布订阅模式"); eventEmitter.unsubscribe("ts"); eventEmitter.publish("ts", "TypeScript发布订阅模式

    1.5K50
    领券