记录一次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 相关文章推荐
验证用户是否修改过页面的数据的实现方法
Sep 26 Javascript
Jquery 切换不同图片示例代码
Dec 05 Javascript
javascript中通过arguments参数伪装方法重载
Oct 08 Javascript
分享一则JavaScript滚动条插件源码
Mar 03 Javascript
javascript基于DOM实现权限选择实例分析
May 14 Javascript
用js编写的简单的计算器代码程序
Aug 04 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
Nov 09 Javascript
JQuery学习总结【二】
Dec 01 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
Apr 26 Javascript
ES10的13个新特性示例(小结)
Sep 23 Javascript
微信小程序自定义菜单切换栏tabbar组件代码实例
Dec 30 Javascript
微信小程序实现一个简单swiper代码实例
Dec 30 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上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
jQuery操作cookie
2016/08/08 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
wxPython框架类和面板类的使用实例
2014/09/28 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
Python变量类型知识点总结
2019/02/18 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
纯CSS3实现运行时钟的示例代码
2021/01/25 HTML / CSS
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
党员思想汇报范文
2013/12/30 职场文书
护理专业求职信
2014/06/15 职场文书
论文答辩开场白大全
2015/05/27 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
母亲节感言
2015/08/03 职场文书
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android