简单封装一个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(); 
相关推荐
To_OC9 分钟前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea29 分钟前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望42 分钟前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
万少1 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波0071 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis2 小时前
es6知识点1-自备使用
前端·ecmascript·es6
小爬的老粉丝3 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
计算机魔术师4 小时前
新兴多智能体系统的模式与问题
前端
用户059540174464 小时前
AI Agent 上下文污染踩坑实录:用 pytest + Redis 揪出 3 类记忆串号 bug,排查 6 小时
前端·css
满栀5854 小时前
状态管理:Redux、Vuex、Pinia 核心区别
前端·javascript·typescript