记录一次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插件原来如此简单 jQuery插件的机制及实战
Feb 07 Javascript
js中跨域方法原理详解
Jul 19 Javascript
Grunt入门教程(自动任务运行器)
Aug 06 Javascript
js css实现垂直方向自适应的三角提示菜单
Jun 26 Javascript
jQuery插件WebUploader实现文件上传
Nov 07 Javascript
浅谈React Native 中组件的生命周期
Sep 08 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
Feb 22 Javascript
vue .sync修饰符的使用详解
Jun 15 Javascript
Vue加载组件、动态加载组件的几种方式
Aug 31 Javascript
layui输入框中只允许输入整数的实现方法
Sep 18 Javascript
详解JavaScript原型与原型链
Nov 16 Javascript
深入理解Vue的数据响应式
May 15 Vue.js
一篇文章让你搞懂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缓存的详解
2013/05/15 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
Python使用MONGODB入门实例
2015/05/11 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
python生成带有表格的图片实例
2019/02/03 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
keras导入weights方式
2020/06/12 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
python matlab库简单用法讲解
2020/12/31 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
法学毕业生自我鉴定
2013/11/08 职场文书
关于旷工的检讨书
2014/02/02 职场文书
遗嘱继承公证书
2014/04/09 职场文书
建设工地安全标语
2014/06/07 职场文书
2015年元旦标语大全
2014/12/09 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
小学生读书笔记范文
2015/06/30 职场文书
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL