记录一次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 页面执行时间计算代码
Mar 04 Javascript
验证javascript中Object和Function的关系的三段简单代码
Jun 27 Javascript
jquery 跨域访问问题解决方法(笔记)
Jun 08 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
Sep 18 Javascript
详谈js中window.location.search的用法和作用
Feb 13 Javascript
原生js实现旋转木马轮播图效果
Feb 27 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
Oct 12 Javascript
微信小程序拍照和摄像功能实现方法示例
Feb 01 Javascript
vue设计一个倒计时秒杀的组件详解
Apr 06 Javascript
JavaScript对象原型链原理解析
Jan 22 Javascript
js判断密码强度的方法
Mar 18 Javascript
JavaScript中继承原理与用法实例入门
May 09 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递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
js字符编码函数区别分析
2008/06/05 Javascript
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
2016/06/06 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
Django框架多表查询实例分析
2018/07/04 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
Python流程控制 while循环实现解析
2019/09/02 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
canvas探照灯效果的示例代码
2018/11/30 HTML / CSS
美国网上书店:Barnes & Noble
2018/08/15 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
C#面试题
2016/05/06 面试题
学生实习推荐信范文
2013/11/26 职场文书
廉洁教育学习材料
2014/05/19 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
护理目标管理责任书
2014/07/25 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书
MongoDB数据库之添删改查
2022/04/26 MongoDB