打开test页面,onSocketOpen输出1次,返回上一页,再次打开test页面onSocketOpen输出2次,依次会+1
- 发布:2022-07-25 10:04
- 更新:2025-12-12 14:02
- 阅读:1764
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: 10
HBuilderX类型: 正式
HBuilderX版本号: 3.4.18
手机系统: Android
手机系统版本号: Android 12
手机厂商: 小米
手机机型: 至尊10
页面类型: vue
vue版本: vue3
打包方式: 云端
项目创建方式: HBuilderX
操作步骤:
预期结果:
正常连接1次
正常连接1次
实际结果:
每次+1(是否影响应能。实际上是不是只链接了1次)
每次+1(是否影响应能。实际上是不是只链接了1次)
bug描述:
onSocketOpen打印多次。
onUnload中执行uni.closeSocket()后
第一次打开test页面onSocketOpen打印1次,然后返回上一页,
第二次打开test页面onSocketOpen打印2次
第三次三次,依次每次都会增加1次
(ws地址网络上随便找的一个,可能链接不上,本地启动的ws服务,依然存在这个问题)
套马杆的套子 - 没有解决不了的问题,只有解决不完的问题
在跳转到其他界面的时候,用onUnload的话,界面没卸载的话,不会走onUnload,也不会走uni.closeSocket()
onHide可以试试
https://uniapp.dcloud.net.cn/api/request/socket-task.html 只会测发一次,真机测试正常,打包安卓测试:如果进入页面打开,退出页面关闭,然后再进入页面 就会打开异常。
我的问题大根是这样解决的——
原因:
跳转到其它页面时,原页面有缓存,当第二次进入页面并建立Socket连接时,第一次访问页面时的监听器还在,所以会再次执行sendSocketMessage。
解决方法:
定义一个变量,初始值为true,onHide时设为false;在sendSocketMessage前判断一下,如果变量值为true时才sendSocketMessage。
累加的问题我这边解决了
解决思路:
- 用 uni.connectSocket({}) 返回的 task 去控制就好了
- 之前我用的是 uni 那一套,感觉它不知道关闭那个socket,可以尝试用 task 去关闭,具体代码在附件里
socketTask = await uni.connectSocket({})
用 socketTask 去关闭 socket
socketTask的写法在这里:https://uniapp.dcloud.net.cn/api/request/socket-task.html
这个问题是由于 WebSocket 的事件监听没有被正确移除导致的。每次页面打开时都会添加一个新的 onSocketOpen 监听器,但关闭页面时没有移除之前的监听器,导致监听器不断累积。
解决方案:
使用新的 SocketTask API 替代旧的全局 WebSocket API(官方已废弃 onSocketOpen)
在页面卸载时(onUnload)正确移除监听器
推荐代码修改方式:
// 使用 SocketTask
let socketTask = null
onLoad() {
socketTask = uni.connectSocket({
url: 'ws://example.com'
})
socketTask.onOpen(res => {
console.log('WebSocket连接已打开')
})
}
onUnload() {
if(socketTask) {
socketTask.close()
socketTask = null
}
}
更多细节可参考 WebSocket API 文档
内容为 AI 生成,仅供参考
