记录一次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实现兼容IE7的类库 IE7_0_9.zip提供下载
Aug 08 Javascript
js最简单的拖拽效果实现代码
Sep 24 Javascript
浅析document.createDocumentFragment()与js效率
Jul 08 Javascript
js获取电脑分辨率的思路及操作
Nov 22 Javascript
浅析Javascript中“==”与“===”的区别
Dec 23 Javascript
简易的投票系统以及js刷票思路和方法
Apr 07 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
Jul 08 Javascript
原生JS:Date对象全面解析
Sep 06 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
Aug 14 Javascript
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
vue中promise的使用及异步请求数据的方法
Nov 08 Javascript
electron 如何将任意资源打包的方法步骤
Apr 16 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
PHP中set error handler函数用法小结
2015/11/11 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
JS常用知识点整理
2017/01/21 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
Vue自定义指令写法与个人理解
2019/02/09 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
python 图片验证码代码分享
2012/07/04 Python
使用Python脚本操作MongoDB的教程
2015/04/16 Python
python中logging包的使用总结
2018/02/28 Python
解决python 输出是省略号的问题
2018/04/19 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
Python读写文件基础知识点
2019/06/10 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
实习医生自我评价
2013/09/22 职场文书
师范应届生语文教师求职信
2013/10/29 职场文书
《高尔基和他的儿子》教学反思
2014/04/09 职场文书
班级寄语大全
2014/04/10 职场文书
民生工作实施方案
2014/05/31 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
八项规定整改方案
2014/10/01 职场文书
谢师宴邀请函
2015/02/02 职场文书
党支部书记岗位职责
2015/02/15 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
党员承诺书格式范文
2015/04/28 职场文书
合同审查法律意见书
2015/06/04 职场文书
钢琴师观后感
2015/06/12 职场文书