详解:JS的四种异步解决方案之分布/订阅,及其利弊。

上期讲了详解:JS异步解决方案之分布/订阅,及其弊端,原文链接在文章后面,分布/订阅是异步的一种方式而已,本期讲解第六个方案。

一、什么是分布/订阅

分布/订阅(Publish/Subscribe)是一种软件架构模式,用于实现组件之间的解耦和异步通信。

在分布/订阅模式中,组件分为两个角色:发布者(Publisher)和订阅者(Subscriber)。发布者负责发布消息或事件,而订阅者负责订阅感兴趣的消息或事件。

在分布/订阅模式中,发布者和订阅者之间不直接通信,而是通过调度中心或消息队列来进行消息的传递和分发。发布者只需将消息发布到调度中心或消息队列中,而不需要关心具体的订阅者是谁。订阅者只需订阅感兴趣的消息或事件,并在调度中心或消息队列接收到相关消息时进行处理。


二、角色和步骤

具体来说,分布/订阅模式包含以下几个组件:

  1. 发布者(Publisher):负责发布事件,通常是某个对象或函数。
  2. 订阅者(Subscriber):负责订阅事件,通常是某个函数或方法。
  3. 事件(Event):表示某个状态或动作,可以是任何类型的数据。
  4. 调度中心(Event Bus):负责管理事件和订阅者之间的关系,通常是一个全局对象或单例。

在分布/订阅模式中,发布者通过调度中心发布事件,订阅者通过调度中心订阅事件,当事件被发布时,调度中心会通知所有订阅者执行相应的处理函数。


三、示例代码

下面是一个简单的分布/订阅模式的示例:

// 定义调度中心
const eventBus = {handlers: {},subscribe(event, handler) {if (!this.handlers[event]) {this.handlers[event] = []}this.handlers[event].push(handler)},publish(event, data) {if (this.handlers[event]) {this.handlers[event].forEach(handler => handler(data))}}
}// 定义发布者
const publisher = {publishData() {const data = { message: 'Hello, World!' }eventBus.publish('data', data)}
}// 定义订阅者
const subscriber = {handleData(data) {console.log(data.message)}
}// 订阅事件
eventBus.subscribe('data', subscriber.handleData)// 发布事件
publisher.publishData() // 输出:Hello, World!

在上面的示例中,调度中心使用一个对象来存储事件和对应的处理函数,订阅者通过调用subscribe方法来订阅事件,发布者通过调用publish方法来发布事件。当事件被发布时,调度中心会遍历所有订阅该事件的处理函数并执行。


四、优缺点和适用场景

分布/订阅(Publish/Subscribe)模式具有以下优点、缺点和适用场景:

优点:

  1. 解耦性:发布者和订阅者之间通过调度中心进行通信,彼此之间不直接依赖,从而实现了解耦。发布者和订阅者可以独立进行开发和维护,更容易扩展和修改。
  2. 可扩展性:由于发布者和订阅者之间解耦,可以方便地增加新的发布者和订阅者,而不需要修改现有的代码。
  3. 灵活性:发布者可以同时向多个订阅者发布消息,实现消息的广播和多路复用。订阅者可以选择订阅感兴趣的消息,忽略其他消息,提高系统的灵活性。

缺点:

  1. 调度中心的性能压力:调度中心或消息队列扮演着中间人的角色,负责接收、分发和存储消息。如果消息量很大,调度中心的性能可能成为瓶颈,需要进行优化或使用分布式消息队列来解决。
  2. 系统复杂性增加:引入调度中心或消息队列会增加系统的复杂性,需要额外的开发和维护工作。同时,需要保证调度中心或消息队列的可靠性和高可用性,以确保消息的可靠传递和处理。

适用场景:

  1. 异步通信:当发布者和订阅者之间需要进行异步通信时,可以使用分布/订阅模式。例如,当一个组件的操作可能需要较长时间才能完成,而其他组件需要在操作完成后进行相应的处理时,可以使用分布/订阅模式来实现异步通信。
  2. 多对多通信:当一个消息需要被多个订阅者接收和处理时,可以使用分布/订阅模式。例如,一个事件发生后需要通知多个组件进行相应的处理,可以使用分布/订阅模式来实现多对多通信。
  3. 松耦合和可扩展性要求高:当系统需要具有松耦合和可扩展性的特点时,可以使用分布/订阅模式。发布者和订阅者之间不直接依赖,可以独立进行开发和维护,更容易扩展和修改。

总之,分布/订阅模式适用于需要解耦、异步通信和多对多通信的场景,能够提高系统的灵活性和可扩展性。但需要注意调度中心的性能和系统的复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2905452.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv9改进策略:注意力机制 | FocalNet焦点调制注意力取代自注意力

💡💡💡本文改进内容:由于自注意力二次的计算复杂度效率较低,尤其是对于高分辨率输入。因此,作者提出了focal modulation network(FocalNet)使用焦点调制模块来取代自注意力。 改进结…

黑群晖基于docker配置frp内网穿透

前言 我的黑群晖需要设置一下内网穿透来外地访问,虽然zerotier的p2p组网已经很不错了,但是这个毕竟有一定的局限性,比如我是ios的国区id就下载不了zerotier的app,组网不了 1.下载镜像 选择第一个镜像 2.映射文件 配置frpc.ini&a…

Python:文档注释、类型标注和注释宏# type:

目录 1、增加文档注释2、增加类型标注3、增加注释宏 看一段简单的代码 def add(x, y):return x y如下代码调用函数,可以正常执行 print(add(1, 2)) # 3 print(add(1, 2)) # 121、增加文档注释 def add(x, y):"""sum x and y:param x: int:param y…

企业年报组织机构代码查询入口

全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码,共9位组成; 组织机构代码在哪里怎么查询? 1、打开「词令」小程序; 2、打开词令小程序后&am…

Python学习之-推导式

前言: 什么是推导式? Python的推导式(comprehension)是一种简洁、灵活的构建序列(如列表、字典、集合)的方法。推导式常用于根据某个序列或可迭代对象来创建新的序列,遵循特定的规则或应用函数…

2014年认证杯SPSSPRO杯数学建模B题(第二阶段)位图的处理算法全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 B题 位图的处理算法 原题再现: 图形(或图像)在计算机里主要有两种存储和表示方法。矢量图是使用点、直线或多边形等基于数学方程的几何对象来描述图形,位图则使用像素来描述图像。一般来说&#…

Xilinx IDDR及ODDR使用和仿真

平台:Vivado2018 官方相关文档,ug471_7Series_SelectIO.pdf 关于IDDR与ODDR Input DDR Resource(IDDR) 外部的数据在时钟的上下沿同时传输数据,我们可以使用IDDR原语将输入的单bit数据转化为2bit的数据输出。同时数据速率变为原来的二分之一…

基于java+springboot+vue实现的宠物领养救助平台(文末源码+Lw+ppt)23-363

摘 要 宠物领养救助平台采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的java进行编写,使用了springboot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括:个人信息修改,对用户、…

N5230A安捷伦N5230A网络分析仪

181/2461/8938产品概述: Agilent N5230A 网络分析仪提供了速度和精度的卓越组合,用于测量多端口和平衡组件,例如高达 50 GHz 的滤波器、双工器和射频模块(取决于选件)。Agilent N5230A 分析仪的自动端口扩展功能可自动…

物联网实战--入门篇之(一)物联网概述

目录 一、前言 二、知识梳理 三、项目体验 四、项目分解 一、前言 近几年很多学校开设了物联网专业,但是确却地讲,物联网属于一个领域,包含了很多的专业或者说技能树,例如计算机、电子设计、传感器、单片机、网…

小米汽车正式发布:开启智能电动新篇章

随着科技的不断进步,汽车产业正经历着前所未有的变革。智能电动汽车作为这一变革的重要方向,正吸引着越来越多的目光。在这个充满机遇和挑战的时代,小米汽车凭借其卓越的技术实力和深厚的市场底蕴,终于迈出了坚实的一步。今天&…

C语言 | qsort()函数使用

目录: 1.qsort介绍 2.使⽤qsort函数 排序 整型数据 3.使⽤qsort函数 排序 结构体数据 4. qsort函数的模拟实现冒泡排序 qsort()函数 是一个 C语言编译器函数库自带的排序函数, 它可以对指定数组(包括字符串,二维数组&#x…

最新2024年增强现实(AR)营销指南(完整版)

AR营销是新的最好的东西,就像元宇宙和VR营销一样。利用AR技术开展营销活动可以带来广泛的利润优势。更不用说,客户也喜欢AR营销! 如果企业使用AR,71%的买家会更多地购物。40%的购物者准备在他们可以在AR定制的产品上花更多的钱。…

unity3d for web

时光噶然 一晃好多年过去了(干了5年的u3d游戏),记得最后一次使用的版本好像是 unity 2017。 那个是 unity3d for webgl 还需要装个插件。用起来很蛋疼。 最近做一个小项目 在选择是用 Layabox 还是 cocosCreate 的时候 我想起了老战友 Uni…

HTTP,Servlet

HTTP 概念:HyperTextTransferProtocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则 HTTP协议特点: 1.基于TCP协议:面向连接,安全 2.基于请求-响应模型的:一次请求对应一次响应 …

iOS网络抓包工具在移动应用开发中的关键作用与应用

摘要 本文将深入探讨iOS平台上常用的网络抓包工具,包括Charles、克魔助手、Thor和Http Catcher,以及通过SSH连接进行抓包的方法。此外,还介绍了克魔开发助手作为iOS应用开发的辅助工具,提供的全方面性能监控和调试功能。 在iOS应…

【塑料烧杯】PTFE带把手耐强酸碱四氟烧杯可灵活加工

PTFE烧杯,也叫四氟烧杯,需在石棉网上使用,不可直接接触明火、传热性能好、耐腐蚀、内壁光滑。搭配防腐电热板、赶酸电热板后期赶酸使用效果更佳。 可灵活加工各种规格形状四氟烧杯,也可以单独配盖子。 PTFE 规格参考:…

vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片

一、后端直接返回图片url 当图片字段接口直接返回的是图片url&#xff0c;可以直接放到img标签上 <img v-if"thumbLoader" class"r-image-loader-thumb" :src"resUrl" /> 二、当图片字段接口直接返回的是图片Id 那么就需要去拼一下图片…

fastadmin学习05-开启debug以及配置

FastAdmin 框架提供了对 .env 环境变量配置的支持&#xff0c;并附带一个默认示例文件 .env.sample。在安装后&#xff0c;框架并不会自动启用 env 环境变量&#xff0c;需要手动将 .env.sample 复制为 .env 并进行配置。 如果不开启.env会读取database.php中的配置 下面测试…

Web Components使用(一)

在使用Web Components之前&#xff0c;我们先看看上一篇文章Web Components简介&#xff0c;其中提到了相关的接口、属性和方法。 正是这些接口、属性和方法才实现了Web Components的主要技术&#xff1a;Custom elements&#xff08;自定义元素&#xff09;、Shadow DOM&#…