简单封装一个websocket构造函数

问题描述

最近维护一个老项目,发现项目中有大量重复代码,特别是websocket的调用这一块,同样的代码复制了十几个页面,于是自己封装了一个websocket调用的构造函数。

javascript 复制代码
export default class CreateWebSocket {
  constructor(url) {
    // ws地址
    this.url = url;
    // 定义ws对象
    this.ws = null;
    // ws定时器
    this.wsTimer = null;
    this.onDataReceived = null;
    this.wsInit();
  }

  // 初始化ws
  wsInit = () => {
    // 销毁ws
    this.wsDestroy();
    // 初始化ws
    this.ws = new WebSocket(this.url);
    // ws连接建立时触发
    this.ws.addEventListener("open", this.wsOpenHanler);
    // ws服务端给客户端推送消息
    this.ws.addEventListener("message", this.wsMessageHanler);
    // ws通信发生错误时触发
    this.ws.addEventListener("error", this.wsErrorHanler);
    // ws关闭时触发
    this.ws.addEventListener("close", this.wsCloseHanler);
  };
  wsOpenHanler = (event) => {
    console.log("ws建立连接成功");
  };
  wsMessageHanler = (e) => {
    console.log("接收数据", e);
    //方法1
    // var event = new CustomEvent("onMessage", { detail: e });
    // this.ws.dispatchEvent(event);

    //方法2
    this.onDataReceived && this.onDataReceived(e);
  };
  getData = (callback) => {
    this.onDataReceived = callback;
  };
  //断开重连
  reconnect = () => {
    this.wsTimer && clearTimeout(this.wsTimer);
    this.wsTimer = setTimeout(() => {
      this.wsInit();
    }, 5000);
  };

  wsErrorHanler = (event) => {
    console.log(event, "通信发生错误");
    this.reconnect();
  };
  wsCloseHanler = (event) => {
    console.log(event, "ws连接关闭");
    this.reconnect();
  };
  wsDestroy = () => {
    if (this.MyWebSocket !== null) {
      this.ws.removeEventListener("open", this.wsOpenHanler);
      this.ws.removeEventListener("message", this.wsMessageHanler);
      this.ws.removeEventListener("error", this.wsErrorHanler);
      this.ws.removeEventListener("close", this.wsCloseHanler);
      this.ws.close();
      this.ws = null;
      this.wsTimer && clearTimeout(this.wsTimer);
    }
  };
}

页面调用

javascript 复制代码
const socket = new Create('ws://190.201.8.203:80');
//方法一
socket.ws.addEventListener('onMessage', (event) => {
    //此处写接收到数据后的处理逻辑            
})
//方法二
socket.getData(data=>{
   //此处写接收到数据后的处理逻辑
})

注意

离开页面一定要卸载ws

javascript 复制代码
socket && socket.wsDestroy(); 
相关推荐
前端风云志11 分钟前
TypeScript结构化类型初探
javascript
musk121228 分钟前
electron 打包太大 试试 tauri , tauri 安装打包demo
前端·electron·tauri
翻滚吧键盘1 小时前
js代码09
开发语言·javascript·ecmascript
万少1 小时前
第五款 HarmonyOS 上架作品 奇趣故事匣 来了
前端·harmonyos·客户端
OpenGL2 小时前
Android targetSdkVersion升级至35(Android15)相关问题
前端
rzl022 小时前
java web5(黑马)
java·开发语言·前端
Amy.Wang2 小时前
前端如何实现电子签名
前端·javascript·html5
海天胜景2 小时前
vue3 el-table 行筛选 设置为单选
javascript·vue.js·elementui
今天又在摸鱼2 小时前
Vue3-组件化-Vue核心思想之一
前端·javascript·vue.js
蓝婷儿2 小时前
每天一个前端小知识 Day 21 - 浏览器兼容性与 Polyfill 策略
前端