记录一次websocket封装的过程


Posted in Javascript onNovember 23, 2020

在一个应用中,websocket一般都是以单例形式存在的,即在整个应用中,websocket实例始终保持唯一。但有时我们要用到websocket实例的时候,可能websocket还没实例化,所以要做成异步的形式来获取实例。

一、封装。先创建 socket.ts 文件

import EventEmitter from 'events'; // 这里用到了 events 包
const ee = new EventEmitter();
class Ws {
 private wsUrl: string = '';
 private socket: WebSocket | undefined; // socket实例
 private lockReconnect: boolean = false; // 重连锁
 private timeout: NodeJS.Timeout | undefined;

 // 初始化socket,一般在应用启动时初始化一次就好了,或者需要更换wsUrl
 public init(wsUrl: string) {
  this.wsUrl = wsUrl;
  this.createWebSocket();
 }

 // 获取socket实例
 public getInstance(): Promise<WebSocket> {
  return new Promise((resolve, reject) => {
   if (this.socket) {
    resolve(this.socket);
   } else {
    ee.on('socket', (state: string) => {
     if (state === 'success') {
      resolve(this.socket);
     } else {
      reject();
     }
    });
   }
  });
 }

 // 创建socket
 private createWebSocket() {
  try {
   console.log('websocket 开始链接');
   const socket = new WebSocket(this.wsUrl);
   socket.addEventListener('close', () => {
    console.log('websocket 链接关闭');
    this.socket = undefined;
    this.reconnect();
   });
   socket.addEventListener('error', () => {
    console.log('websocket 发生异常了');
    this.socket = undefined;
    this.reconnect();
   });
   socket.addEventListener('open', () => {
    // 可在此进行心跳检测
    // this.heartCheck.start();
    console.log('websocket open');
    this.socket = socket;
    ee.emit('socket', 'success');
   });
   socket.addEventListener('message', (event) => {
    console.log('websocket 接收到消息', event);
   });
  } catch (e) {
   console.log('socket catch error', e);
   this.reconnect();
  }
 }

 // 重连
 private reconnect() {
  if (this.lockReconnect) {
   return;
  }
  console.log('websocket 正在重新连接');
  this.lockReconnect = true;
  //没连接上会一直重连,设置延迟避免请求过多
  this.timeout && clearTimeout(this.timeout);
  this.timeout = setTimeout(() => {
   this.createWebSocket();
   this.lockReconnect = false;
  }, 5000);
 }
}

export default new Ws();

二、引入并使用

import socket from '@/utils/ws';

socket
 .getInstance()
 .then((ws) => {
   // 这里的 ws 就是实例化后的 websocket,可以直接使用 websocket 原生 api
  console.log('getInstance ws', ws);
  ws.addEventListener('message', (event) => {
    console.log('ws 接收到消息', event);
   });
 })
 .catch(() => {});

以上就是记录一次websocket封装的过程的详细内容,更多关于websocket封装的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js类中获取外部函数名的方法
Aug 19 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
Aug 05 Javascript
jsp网页搜索结果中实现选中一行使其高亮
Feb 17 Javascript
javascript将DOM节点添加到文档的方法实例分析
Aug 04 Javascript
javascript检测flash插件是否被禁用的方法
Jan 14 Javascript
微信小程序 wx:key详细介绍
Oct 28 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
Mar 29 Javascript
老生常谈angularjs中的$state.go
Apr 24 Javascript
小程序如何写动态标签的实现方法
Feb 05 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
May 20 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
Oct 24 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
Nov 23 #Javascript
微信小程序实现锚点跳转
Nov 23 #Javascript
javascript实现电商放大镜效果
Nov 23 #Javascript
用webAPI实现图片放大镜效果
Nov 23 #Javascript
Vue 的 v-model用法实例
Nov 23 #Vue.js
JavaScript实现网页留言板功能
Nov 23 #Javascript
VUE+Element实现增删改查的示例源码
Nov 23 #Vue.js
You might like
ADODB的数据库封包程序库
2006/12/31 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
PHP 错误处理机制
2015/07/06 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
jquery实现图片按比例缩放示例
2014/07/01 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
Vue实现购物车功能
2017/04/27 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
PyQt实现界面翻转切换效果
2018/04/20 Python
python实现合并两个排序的链表
2019/03/03 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
哪些是python中web开发框架
2020/06/17 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
Born鞋子官网:Born Shoes
2017/04/06 全球购物
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
体育教育个人自荐信范文
2013/12/01 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
马智宇结婚主持词
2014/04/01 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
员工辞职信范文
2015/03/02 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
粗暴解决CUDA out of memory的问题
2021/05/22 Python
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers
尝试使用Python爬取城市租房信息
2022/04/12 Python