当前位置: 首页 > news >正文

Uniapp:WebSocket 重连之后累加触发 uni.onSocketOpen()

省流

  • 不要用 uni.xxx 那一套,用 socketTask = await uni.connectSocket({}) socketTask 去控制

业务逻辑描述

  1. 第一次进入应用主页,连接 WebSocket
  2. 手机熄屏之后,断开当前连接的 WebSocket
  3. 手机亮屏之后,再次进入应用后,重新连接 WebSocket 服务

问题

  • 亮屏之后,再次进入应用,WebSocket 会累加,导致我发送的心跳包:

  • 第一次熄屏亮起,会在短时间内发送两次

  • 第二次熄屏亮起,会在短时间内发送三次

  • …累加

问题截图

在这里插入图片描述

请添加图片描述

问题代码

大概就是这套逻辑

用的都是 uni.xxx 这套,问题就出现在这里了

import { handleSocketMessage } from './websocketUtils'
import Nav2Login from '@/utils/request/modelNavigateToLogin'
let socketOpen = false
let socketMsgQueue: any = []
let heartbeatTimer: any | null = nullasync function startWebsocketServer() {if (heartbeatTimer) {clearInterval(heartbeatTimer)heartbeatTimer = null}if (socketOpen) {await closeWebSocket()}await uni.connectSocket({url: WS_URL,}).then((res) => {})/*** 问题:* https://ask.dcloud.net.cn/question/149762*/uni.onSocketOpen(function (res: any) {socketOpen = truefor (var i = 0; i < socketMsgQueue.length; i++) {sendSocketMessage(socketMsgQueue[i])}socketMsgQueue = []})/*** 这里会有熄屏累积次数的效果*/uni.onSocketMessage(function (res) {console.log('收到服务器内容:' + res.data)handleSocketMessage(res.data)})
}function sendSocketMessage(msg: any) {if (socketOpen) {uni.sendSocketMessage({data: msg,})} else {socketMsgQueue.push(msg)}
}/*** 关闭WebSocket连接*/
export function closeWebSocket() {return new Promise((resolve, reject) => {uni.closeSocket({success: function (res) {console.log('WebSocket关闭成功!:>>', res)socketOpen = falseclearInterval(heartbeatTimer)heartbeatTimer = nullconsole.log('清除心跳定时器')resolve('Close Socket Success')},fail: function (res) {console.log('WebSocket关闭失败!:>>', res)reject('Close Socket Reject')},complete: () => {// console.log('complete')},})})
}
export default startWebsocketServer

解决之后的截图

在这里插入图片描述
解决的代码框架,参考官方文档

在这里插入图片描述

let socketTask: any = null
//  complete: (res) => {}, 一定要有
socketTask = await uni.connectSocket({url: WS_URL,complete: (res) => {},
})
socketTask.onOpen(() => {})
socketTask.onMessage((res: any) => {})
socketTask.close({success: (res: any) => {},fail: (res: any) => {},
})

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024/9/3黑马头条跟学笔记(一)
  • c/c++:CMakeLists.txt中添加编译/连接选项使用内存错误检测工具Address Sanitizer(ASan)
  • VM Workstation虚拟机AlmaLinux 9.4操作系统安装(桌面版安装详细教程)(宝塔面板的安装),填补CentOS终止支持维护的空白
  • 开源项目管理工具 Plane 安装和使用教程
  • opencv车道偏离系统-代码+原理-人工智能-自动驾驶
  • 【Next】3. 开发规范
  • 哪个编程工具让你的工作效率翻倍?
  • zhidianyun01/基于 ThinkPHP+Mysql 灵活用工+灵活用工源码+灵活用工平台源码
  • 怎样通过c51实现环境监测设计
  • shell脚本—————局域网IP扫描
  • vscode常用插件及设置
  • 在繁忙工作环境中提升开发效率:JetBrains IntelliJ IDEA 的应用
  • Java异常处理-如何选择异常类型
  • 【软件测试】需求之外的“意外”:如何处理范围外的问题?
  • Hive的存储格式
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【EOS】Cleos基础
  • 【React系列】如何构建React应用程序
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • co模块的前端实现
  • CSS中外联样式表代表的含义
  • Electron入门介绍
  • JS数组方法汇总
  • js中的正则表达式入门
  • socket.io+express实现聊天室的思考(三)
  • STAR法则
  • web标准化(下)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 高性能JavaScript阅读简记(三)
  • 前端之React实战:创建跨平台的项目架构
  • 浅谈web中前端模板引擎的使用
  • 微信小程序填坑清单
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • Prometheus VS InfluxDB
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • (C)一些题4
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (第一天)包装对象、作用域、创建对象
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (理论篇)httpmoudle和httphandler一览
  • (一)Neo4j下载安装以及初次使用
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • *Django中的Ajax 纯js的书写样式1
  • .equals()到底是什么意思?
  • .Net core 6.0 升8.0
  • .NET Core中如何集成RabbitMQ
  • .NET delegate 委托 、 Event 事件
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net Stream篇(六)
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 调用海康SDK以及常见的坑解释
  • .NET 解决重复提交问题
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net解析传过来的xml_DOM4J解析XML文件