简单封装一个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(); 
相关推荐
无限聚核2 分钟前
抖音 certificate.prepare 之后怎么验券?和美团 msconsume 差在哪,无限聚核
前端·微信小程序
2603_9658966211 分钟前
Grid 网格布局|CSS 二维页面排版体系
前端·css
有味道的男人27 分钟前
搜好货平台关键词商品搜索接口:分页容错与商品数据轻量化提取方案
服务器·前端·javascript
lovingsoft1 小时前
Chrome Lighthouse 详解
前端·chrome
Qlly1 小时前
全栈工程师怎么接需求?从一句「加个功能」聊到能开发、能验收
前端·后端
马可家的菠萝1 小时前
你的微信“文件传输助手”,是不是已经成了第二个网盘?
前端·后端·架构
略略略啦1 小时前
Vibe Coding 基于Spec DD和TDD的实践指南
前端
shmily麻瓜小菜鸡2 小时前
前端实现图片与PDF文字识别敏感信息打码方案
前端·pdf·状态模式
打工仔折腾 AI2 小时前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
汉堡大王95272 小时前
单次输出拉到100万Token:拆完 Gemini 4 Argon 的续写协议,才看懂谷歌这7个月在憋什么
前端·人工智能·后端