【vue3+Typescript】unapp+stompsj模式下替代plus-websocket的封装模块

由于plus-websocket实测存在消息丢失的问题,只能寻找替代的方案,看文章说使用原生的即可很好的工作。而目前在stompjs里需要使用websocket类型的封装模块,看了下原来提供的接口,采用uniapp原生的websocket模式,对原模块进行了重新封装,最终单元模块如下:

ccWebsocket.ts:

TypeScript 复制代码
import { IStompSocket } from '@stomp/stompjs'

let socket: UniApp.SocketTask

/**
 * uniapp WebSocket Polyfill
 * @Jim 2024/11/23
 */
class WebSocketPolyfill implements IStompSocket {
  constructor(url) {
    // 创建连接
    this.url = url

    if (socket) {
      socket.onClose = () => {} // 清理侦听
      socket.close({}) // 正常关闭
    }

    socket = uni.connectSocket({
      url,
      success: (res) => {
        console.log('连接创建成功:', res)
      },
      fail: (err) => {
        console.error('连接创建失败:', err)
      }
    })

    socket.onOpen((res) => {
      console.log('连接已开启', res)
      this.onopen(res)
    })

    socket.onClose((res) => {
      console.log('连接已关闭', res)
      this.onclose(res)
    })

    socket.onError((res) => {
      console.log('连接错误', res)
      this.onclose(res) // 出错断开重连,因为uniapp原生onclose监听不到
    })

    socket.onMessage((res) => {
      this.onmessage(res)
    })
  }

  url: string
  get readyState(): number {
    return (socket as any).readyState
  }

  /**
   * 连接开启回调,会被StompHandler接管
   */
  onopen(res) {}

  /**
   * 连接关闭回调,会被StompHandler接管
   */
  onclose(res) {}

  /**
   * 连接异常回调,会被StompHandler接管
   */
  onerror(res) {}

  /**
   * 接收消息回调,会被StompHandler接管
   */
  onmessage(res) {}

  /**
   * 发送消息
   */
  send(data) {
    if (socket) {
      socket.send({
        data,
        success: () => {
          // console.log('消息发送成功:', data)
        },
        fail: (err) => {
          console.error('消息发送失败:', err)
        }
      })
    }
  }

  /**
   * 关闭连接
   */
  close() {
    if (socket) {
      socket.close({
        success: () => {
          console.log('连接关闭成功')
        },
        fail: (err) => {
          console.error('连接关闭失败:', err)
        }
      })
    }
  }

  /**
   * 检查是否已连接
   */
  connected() {
    const nativeSocket = socket as any
    // console.log('检查连接状态:', nativeSocket.readyState)
    return socket && nativeSocket.readyState === 1
  }
}

export default WebSocketPolyfill

实测在IOS和Android下能很好工作,不会丢失消息了,能自动重连。另外心跳也能正常工作了不用另建立一个线程处理

相关推荐
柯克七七11 小时前
我把 bug 修得太干净了,测试组以为这个模块本来就没问题
前端·javascript·typescript
退休倒计时12 小时前
【每日一题】LeetCode 39. 组合总和 TypeScript
算法·leetcode·typescript
yyt36304584112 小时前
KlineChartQuant Tooltip 高频交互 200FPS 性能优化完整复盘
前端·经验分享·性能优化·typescript·vue·交互·chrome devtools
用户09340777351417 小时前
HarmonyOS WPS Open SDK 实践:办公审批附件「打开—编辑—回传」代码实现
typescript·harmonyos
Flynt17 小时前
TypeScript 5.8 让我少踩了一个大坑,顺手再聊聊 --erasableSyntaxOnly
前端·javascript·typescript
这里是杨杨吖1 天前
SpringBoot+Vue心理健康咨询系统 附带详细运行指导视频
spring boot·vue·心理健康
退休倒计时2 天前
【每日一题】LeetCode 17. 电话号码的字母组合 TypeScript
算法·leetcode·typescript
无情的西瓜皮3 天前
MCP 协议实战:从零搭建一个 MCP 服务器(Node.js 版)
vue.js·人工智能·typescript·node.js
退休倒计时3 天前
【每日一题】LeetCode 78. 子集 TypeScript
算法·leetcode·typescript