记录一次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 相关文章推荐
利用window.name实现windowStorage代码分享
Jan 02 Javascript
jQuery页面加载初始化常用的三种方法
Jun 04 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
js调出上下文菜单的实例
Dec 17 Javascript
AngularJS包括详解及示例代码
Aug 17 Javascript
jQuery页面弹出框实现文件上传
Feb 09 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
Sep 18 Javascript
jquery无缝图片轮播组件封装
Nov 25 jQuery
JS数组扁平化(flat)方法总结详解
Jun 24 Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 Javascript
Vue+ElementUI table实现表格分页
Dec 14 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
Aug 19 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连接Oracle数据库
2006/10/09 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
js变量以及其作用域详解
2020/07/18 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
vue 组件中slot插口的具体用法
2018/04/03 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
python 除法保留两位小数点的方法
2018/07/16 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
pycharm新建一个python工程步骤
2019/07/16 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
大专生简历的自我评价
2013/11/26 职场文书
会计系个人求职信范文分享
2013/12/20 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
党员示范岗材料
2014/12/19 职场文书
JS ES6异步解决方案
2021/04/29 Javascript