记录一次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 相关文章推荐
jquery validation验证身份证号,护照,电话号码,email(实例代码)
Nov 06 Javascript
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
JQuery实现的图文自动轮播效果插件
Jun 19 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
Jun 24 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
Dec 08 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
Mar 24 jQuery
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
May 10 Javascript
微信浏览器禁止页面下拉查看网址实例详解
Jun 28 Javascript
AngularJS日期格式化常见操作实例分析
May 17 Javascript
一个Vue页面的内存泄露分析详解
Jun 25 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
Apr 04 Javascript
Javascript var变量删除原理及实现
Aug 26 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使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
2020/08/26 Javascript
Python3 入门教程 简单但比较不错
2009/11/29 Python
python写的ARP攻击代码实例
2014/06/04 Python
Python的Flask框架中Flask-Admin库的简单入门指引
2015/04/07 Python
编写Python的web框架中的Model的教程
2015/04/29 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
深入理解Python对Json的解析
2017/02/14 Python
python 调用c语言函数的方法
2017/09/29 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
基于python操作ES实例详解
2019/11/16 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
通信专业个人自我鉴定
2013/10/21 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
五年级学生评语大全
2014/12/26 职场文书
大学生学年个人总结
2015/02/15 职场文书
干部培训简讯
2015/07/20 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python