记录一次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 相关文章推荐
javascript中强制执行toString()具体实现
Apr 27 Javascript
JS Replace 全部替换字符的用法小结
Dec 24 Javascript
JavaScript 异常处理 详解
Feb 06 Javascript
EasyUI实现二级页面的内容勾选的方法
Mar 01 Javascript
JS数组array元素的添加和删除方法代码实例
Jun 01 Javascript
学习JavaScript设计模式之装饰者模式
Jan 19 Javascript
简单谈谈JS中的正则表达式
Sep 11 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
Jul 23 Javascript
vue基础之v-bind属性、class和style用法分析
Mar 11 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
Apr 24 Javascript
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
一篇文章让你搞懂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
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
2019/11/13 PHP
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
js中document.write的那点事
2014/12/12 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
vue组件是如何解析及渲染的?
2021/01/13 Vue.js
javascript实现数字时钟效果
2021/02/06 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python实现高效求解素数代码实例
2015/06/30 Python
一些常用的Python爬虫技巧汇总
2016/09/28 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
Python中optparser库用法实例详解
2018/01/26 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
保险内勤岗位职责
2014/04/05 职场文书
项目采购员岗位职责
2014/04/15 职场文书
政府法律服务方案
2014/06/14 职场文书
男性健康日的活动方案
2014/08/18 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL