当前位置: 首页 > news >正文

【ECMAScript】WebSocket模拟HTTP功能的实践:Promise+WebSocket+EventEmitter+Queue

1. 前言

        本篇将结合Promise、WebSocket、EventEmitter和Queue,做一次实践:用WebSocket来模拟HTTP的功能。先不用关心它的用处,就当一次对知识点的整合吧。

2. MockHTTP
方法说明
request(params, callback?)

功能:发起请求,生成uuid标记数据params,将回调逻辑once到事件发射器中,返回一个Promise对象,等待receive触发emit,执行回调逻辑

输入

params - 发送给服务端的数据

callback? - 可选,采用回调函数方式接收数据

输出:Promise<any>

send(params)

功能:将数据推入队列中,待loop取出

输入:params

loop()功能:定时从队列队头取出数据,发给服务端
receive(e)

功能:接收响应数据,触发事件发射器emit方法

输入:e - 事件对象

close()功能:关闭WebSocket连接

import EventEmitter from './EventEmiter';
import Queue from './Queue';export default class MockHTTP {constructor(url) {this.ws = new WebSocket(url);this.eventEmitter = new EventEmitter();this.queue = new Queue();this.ws.onmessage = this.receive;}loop() {if(this.queue.size() && this.ws.readyState === this.ws.OPEN) {// 发起请求const params = this.queue.dequeue();this.ws.send(JSON.stringify(params));}requestAnimationFrame(this.loop);}// 接收数据receive(e) {const data = e.data;const uuid = data.uuid;if(uuid) {this.eventEmitter.emit(uuid);}}send(params) {// 发起的请求放到队列中this.queue.enqueue(params);}// 请求request(params, callback) {return new Promise((resolve, reject) => {// 生成uuid,用来匹配发起的ws请求 和 ws响应const uuid = `${new Date().valueOf()}${Math.round(Math.random() * 1000)}`;// 将回调函数放入事件发射器this.eventEmitter.once(uuid, (data) => {// 采用回调函数接收响应数据if(callback) {callback(data);}// resolveresolve(data);});params.uuid = uuid;this.send(params);});}// 关闭websocket连接close() {this.ws.close();}
}

注:本篇未考虑WebSocket创建失败或连接异常的情况。

3. request执行周期

        从第1步发起请求,最第8步最终响应,经历的过程如下图所示。

其中,

  • 第2步订阅和第7步发布,是事件发射器EventEmitter的订阅/发布功能;
  • 第3步入队和第4步出队,是队列Queue的入队/出队功能;
  • 第5步发送消息和第6步监听响应,是WebSocket的发送send/接收onmessage的功能;
  • 第1步发起请求和第8步执行回调,是用于构建Promise的函数的功能,第8步会使得Promise状态从pending转成fulfilled。
4. Demo源码
const HTTP = new MockHTTP('http://localhost:8080/ws');
const params = {method: 'add',data: {name: '小明',sex: '男',age: 13}
};HTTP.request(params).then((data) => {console.dir(data);
});

有兴趣的同学,可参考我的博文。

【ECMAScript】自己动手实现ES6的Promise-CSDN博客

【网络协议】WebSocket知识点梳理和总结-CSDN博客

【ECMAScript】基于Map和Set手写一个简单EventEmitter实现事件的发布和订阅-CSDN博客

【数据结构】自己动手使用JavaScript实现栈、队列、双端队列(第一篇)-CSDN博客

注:以上,如有不合理之处,还请帮忙指出,大家一起交流学习~   

相关文章:

【ECMAScript】WebSocket模拟HTTP功能的实践:Promise+WebSocket+EventEmitter+Queue

1. 前言 本篇将结合Promise、WebSocket、EventEmitter和Queue&#xff0c;做一次实践&#xff1a;用WebSocket来模拟HTTP的功能。先不用关心它的用处&#xff0c;就当一次对知识点的整合吧。 2. MockHTTP 方法说明request(params, callback?) 功能&#xff1a;发起请求&…...

Linux 软raid - - Barrier

什么是Barriers 在linux软raid中&#xff0c;用来处理正常IO和同步IO的并发问题&#xff0c;可以简单理解为专用于软raid的锁。 软raid在做resync/recovery&#xff0c;或者配置操作时需要raise 屏障&#xff0c;于此同时必须暂停正常IO。 barrier是可以被多次raise的一个计数…...

航空公司管理系统(迷你版12306)

要求 今天分享一个之前辅导留学生的作业&#xff0c;作业要求如下&#xff1a; Project E: Airways Management System Overall description: Your team is employed by an Airways company for the implementation of a computer system responsible for a large part of th…...

嵌入式硬件电路原理图之跟随电路

描述 电压跟随电路 电压跟随器是共集电极电路&#xff0c;信号从基极输入&#xff0c;射极输出&#xff0c;故又称射极输出器。基极电压与集电极电压相位相同&#xff0c;即输入电压与输出电压同相。这一电路的主要特点是&#xff1a;高输入电阻、低输出电阻、电压增益近似为…...

学习录

概述 这几年在迷茫中看了不少资料&#xff0c;有觉得写得很棒的&#xff0c;也有写的很糟糕的。所以一直想写这块的总结来进行归纳&#xff0c;同时也希望能给其他处于迷茫中的朋友提供一份高质量的资料列表(也许一个读者也没有)&#xff0c;以下清单个人觉得值得反复看以及思…...

MongoDB索引详解

概述 索引是一种用来快速查询数据的数据结构。BTree 就是一种常用的数据库索引数据结构&#xff0c;MongoDB 采用 BTree 做索引&#xff0c;索引创建 colletions 上。MongoDB 不使用索引的查询&#xff0c;先扫描所有的文档&#xff0c;再匹配符合条件的文档。使用索引的查询&…...

一文搞定JVM内存模型

鲁大猿&#xff0c;寻精品资料&#xff0c;帮你构建Java全栈知识体系 www.jiagoujishu.cn 运行时数据区 内存是非常重要的系统资源&#xff0c;是硬盘和 CPU 的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、…...

月报总结|Moonbeam 12月份大事一览

一转眼已经到年底啦。本月&#xff0c;Moonbeam基金会发布四个最新战略重点&#xff1a;跨链解决方案、游戏、真实世界资产&#xff08;RWA&#xff09;、新兴市场。其中在新兴市场方面&#xff0c;紧锣密鼓地推出与巴西公司Grupo RO的战略合作。 用户教育方面&#xff0c;为了…...

现有网络模型的使用及修改(VGG16为例)

VGG16 修改默认路径 import os os.environ[TORCH_HOME] rD:\Pytorch\pythonProject\vgg16 # 下载位置太大了&#xff08;140多G&#xff09;不提供直接下载 train_set torchvision.datasets.ImageNet(root./data_image_net, splittrain, downloadTrue, transformtorchvis…...

MacOS M1/M2 Go Debug 配置

前言 换电脑&#xff0c;Go 环境带来一些麻烦&#xff0c;耽误很多时间&#xff0c;稍作记录。 原始电脑是 Mac 旧款&#xff0c;CPU x86 构型&#xff0c;新电脑 M2&#xff0c;因为旧电脑里本地文件很多&#xff0c;为了简化搬迁&#xff0c;还是用了 Mac 自带的迁移&#x…...

paddlehub 文本检测使用

PaddleHub负责模型的管理、获取和预训练模型的使用。 参考&#xff1a;https://github.com/PaddlePaddle/PaddleHub/tree/develop/modules/image/text_recognition/chinese_text_detection_db_server import paddlehub as hub import cv2 # from utils import cv_show import…...

负载均衡概述

负载均衡 负载均衡 建立在现有网络结构之上&#xff0c;它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 四层负载均衡 vs 七层负载均衡 四层负载均衡&#xff08;目标地址和端口交换&#xff09;…...

C# WinForm MessageBox自定义按键文本 COM组件版

c# 更改弹窗MessageBox按钮文字_c# messagebox.show 字体-CSDN博客 需要用到大佬上传到百度云盘的Hook类&#xff0c;在大佬给的例子的基础上改动了点。 应用时自己加GUID和ProgID。 组件实现&#xff1a; using System; using System.Collections.Generic; using System.L…...

基于SpringBoot微信小程序的宠物美容预约系统设计与实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容&#xff1a;SpringBoot、Vue、SSM、HLM…...

在 docker 容器中配置双网卡,解决通讯的问题

目录 1. 查看当前网络信息 2. 创建自定义网络桥 3. 创建双网卡模式 4. 删除默认网卡 已经创建好了的 Docker 容器&#xff0c;要修改它的IP比较麻烦&#xff0c;网上找了几种不同的方法&#xff0c;经过试验都没有成功&#xff0c;下面通过配置双网上来解决 IP 的问题。…...

uniapp中uview组件库CircleProgress 圆形进度条丰富的使用方法

目录 #内部实现 #平台差异说明 #基本使用 #设置圆环的动画时间 #API #Props 展示操作或任务的当前进度&#xff0c;比如上传文件&#xff0c;是一个圆形的进度环。 #内部实现 组件内部通过canvas实现&#xff0c;有更好的性能和通用性。 #平台差异说明 AppH5微信小程…...

Linux操作系统基础(12):Linux的Shell解释器

1. Shell的介绍 在Linux中&#xff0c;Shell 是一种命令行解释器&#xff0c;它是用户与操作系统内核之间的接口&#xff0c;它负责解释用户输入的命令&#xff0c;并将其转换成系统调用或其他操作系统能够执行的指令。 Shell 提供了一种交互式的方式来与操作系统进行通信&am…...

Android开发编程从入门到精通,安卓技术从初级到高级全套教学

一、教程描述 本套教程基于JDK1.8版本&#xff0c;教学内容主要有&#xff0c;1、环境搭建&#xff0c;UI布局&#xff0c;基础UI组件&#xff0c;高级UI组件&#xff0c;通知&#xff0c;自定义组件&#xff0c;样式主题&#xff1b;2、四大组件&#xff0c;Intent&#xff0…...

HackTheBox - Medium - Linux - BroScience

BroScience BroScience 是一款中等难度的 Linux 机器&#xff0c;其特点是 Web 应用程序容易受到“LFI”的攻击。通过读取目标上的任意文件的能力&#xff0c;攻击者可以深入了解帐户激活码的生成方式&#xff0c;从而能够创建一组可能有效的令牌来激活新创建的帐户。登录后&a…...

`nginx/conf/nginx.conf`最简配置说明

nginx/conf/nginx.conf最简配置说明 代码 nginx/conf/nginx.conf worker_processes 1; #工作进程个数;一般对应CPU内核对应一个worker_processes;太多反而让效率变差;# 事件驱动模块; events {worker_connections 1024;#设置每个worker_processes对应多少个联接; }# 网络请…...

商务智能|描述性统计分析与数据可视化

一、商务智能的三大方面 三个主要方面是描述性的统计分析、预测性的分析和指导性的数据分析。 A. 商务智能的知识体系下,数据分析包含了哪三个工作?商务智能体系架构里边关于数据分析的术语是什么? 商务智能的知识体系下,数据分析包含了三个工作,即描述性分析,预测性分析…...

【游记】GDKOI2024

去年稳定 Cu&#xff0c;希望今年来块 Ag。 Day − ∞ -\infty −∞ 不知道什么时候报名交钱的&#xff0c;赶紧问一问。 周四把设备送过来了。最近备战期末 选科 演讲比赛&#xff0c;有点忙不过来。 Day0 下午两点半出发&#xff0c;车程 2h。路上给小绿打肉鸽 1h 掉电…...

linux支持的零拷贝类型以及java对应的支持

在之前整理的零拷贝文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/135321197 https://blog.csdn.net/zlpzlpzyd/article/details/135317834 得出如下 因为开发的程序很多运行在 linux 操作系统上&#xff0c;所以用 linux 进行讲解 linux 调用方式 dma复制次数…...

【TypeScript】声明文件

一、定义 TypeScript 的声明文件包含 .d.ts 扩展名&#xff0c;并用于为 TypeScript 提供关于 JavaScript 代码的类型信息这些文件通常定义了接口、类型别名、类等&#xff0c;但并不包含实际的执行代码当你使用 JavaScript 库或框架时&#xff0c;声明文件就显得非常有用&…...

基于Flutter构建小型新闻App

目录 1. 概述 1.1 功能概述 1.2 技术准备 1.3 源码地址 2. App首页 2.1 pubspec依赖 2.2 热门首页组件 2.2.1 DefaultTabController 2.2.2 Swiper 2.3 新闻API数据访问 2.4 热门首页效果图 3. 新闻分类 3.1 GestureDetector 3.2 新闻分类效果图 4. 收藏功能 4…...

利用python将excel文件转成txt文件,再将txt文件上传hdfs,最后传入hive中

将excel文件转成txt文件&#xff0c;再将txt文件上传hdfs&#xff0c;最后传入hive中 注意的点 &#xff08;1&#xff09;先判断写入的txt文件是否存在&#xff0c;如果不存在就需要创建路径 &#xff08;2&#xff09;如果txt文件已经存在&#xff0c;那么先将对应的文件进行…...

【自学笔记】01Java基础-07面向对象基础-02继承

记录学习Java基础中有关继承、方法重写、构造器调用的基础知识&#xff0c;学习继承之前建议学习static关键字的内容【自学笔记】01Java基础-09Java关键字详解 1 继承概述 1.1 什么是继承&#xff1f; 1.2 继承的特点 子类可以继承父类的属性和行为&#xff0c;但是子类不能…...

二分查找(一)

算法原理 原理&#xff1a;当一个序列有“二段性”的时候&#xff0c;就可以使用二分查找算法。 适用范围&#xff1a;根据规律找一个点&#xff0c;能将这个数组分成两部分&#xff0c;根据规律能有选择性的舍去一部分&#xff0c;进而在另一个部分继续查找。 除了最普通的…...

【华为OD真题 Python】精准核酸检测

文章目录 题目描述输入描述输出描述示例1输入输出说明备注代码实现题目描述 为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。 现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。 现…...

Springboot使用logback

文章目录 目录 文章目录 前言 一、添加依赖 二、使用步骤 三 、测试使用 总结 前言 Logback 是log4j 框架的作者开发的新一代日志框架&#xff0c;它效率更高、能够适应诸多的运行环境&#xff0c;同时天然支持 SLF4J。 Logback 的定制性更加灵活&#xff0c;同时也是 Sprin…...

便宜建站空间/下载一个百度导航

第一步在父组件中写下面代码 onRef (ref) > {this.child ref}; 第二步将此方法传个子组件 <SelectModalonRef{this.onRef}/> 第三步在子组件中实现以下代码 componentDidMount() {this.props.onRef(this)} 第四步在父组件调用子组件某个函数 //restInfo是我的方…...

17.zwd一起做网站池尾站/北京网站推广排名外包

测试策略是描述测试项目和测试任务之间的关系。它用来说明要测什么&#xff0c;如何测&#xff0c;如何协调测试资源和测试时间等。测试策略制定的是否合理高效会对测试项目的进度产生很大的影响。那么&#xff0c;如何制定一个好的测试策略并且能防止遗漏呢&#xff1f;一个好…...

网站怎么制作小程序/google首页

笔者最近开始对机器学习非常感兴趣&#xff0c;作为一个有志向的软设方向的女孩纸&#xff0c;我开始了学习的第一步入门&#xff0c;下面将今天刚刚学习的kNN及其应用进行总结和回顾&#xff0c;希望可以得到更好的提升&#xff0c;当然&#xff0c;有志同道合者&#xff0c;你…...

joomla 2.5:你的网站建设_使用与管理 下载/全媒体广告代理

该话题的继续延伸主要就是 SQL 的语法了, 草草收场的原因是现在的脑筋已经进入了 IntraWeb 的世界.相关备忘会随时补充在下面://连接多个数据库的参考代码: FDConnection1.ExecSQL(ATTACH c:\hr.sdb AS hr); FDConnection1.ExecSQL(ATTACH c:\cust.sdb AS cust); FDQuery1.Open…...

网站设计经典案例/网站设计制作在哪里找

用于自动更新&#xff0c;但一般没有&#xff0c;且在MyEclipse消耗内存&#xff0c;建议关闭updating indexes MyEclipse的updating indexes功能&#xff0c;看着并不起眼&#xff0c;但是如果机器的资源比较紧张的时候&#xff0c;就会带来不少的麻烦&#xff0c;因为在updat…...

网站建设毕业论文5000字/手机怎么制作网站

http://www.genban.org/news/dedecms-7577.html前两天用DEDE做二次开发的时候&#xff0c;遇到一个问题&#xff0c;领导让给每个栏目增加一个栏目图片的功能&#xff0c;网上找了些东西&#xff0c;结合自己实际做的时候的方法&#xff0c;下面详细描述下具体的实现方式&#…...