记录一次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 change,propertychange,input事件小议
Dec 20 Javascript
解析prototype,JQuery中跳出each循环的方法
Dec 12 Javascript
回车直接实现点击某按钮的效果即触发单击事件
Feb 27 Javascript
jQuery实现简单的日期输入格式化控件
Mar 12 Javascript
学习JavaScript设计模式(封装)
Nov 26 Javascript
关于ES6的六个小特性(二)
Feb 20 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
May 13 jQuery
JavaScript循环_动力节点Java学院整理
Jun 28 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
Dec 06 Javascript
学习node.js 断言的使用详解
Mar 18 Javascript
JS阻止事件冒泡的方法详解
Aug 26 Javascript
JavaScript函数Call、Apply原理实例解析
Feb 17 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
thinkPHP5.0框架安装教程
2017/03/25 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python执行使用shell命令方法分享
2017/11/08 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
Python远程linux执行命令实现
2020/11/11 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
应届本科生推荐信范文
2013/12/25 职场文书
船舶专业个人求职信范文
2014/01/02 职场文书
大学生未来职业生涯规划书
2014/02/15 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
2014年话务员工作总结
2014/11/19 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
考试没考好检讨书
2015/05/06 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers