使用uni-app websocket时调用SocketTask实例的close方法传递的参数无法在onClose接收到onClose参数的code永远是1000

使用uni-app websocket时调用SocketTask实例的close方法传递的参数无法在onClose接收到onClose参数的code永远是1000

开发环境 版本号 项目创建方式
Mac 15.5 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Mac

HBuilderX类型:正式

HBuilderX版本号:4.66

手机系统:Android

手机系统版本号:Android 15

手机厂商:小米

手机机型:14pro

页面类型:vue

vue版本:vue3

打包方式:云端

示例代码:
```cpp
const socketTask = uni.connectSocket({
url: `ws://host/aa`,
success: () => {
socketTask.onClose((e) => {
console.log(e) // e永远是 {code: 1000, reason: ''}
})
socketTask.close({code: 1, reason: 'close'})
},
})

操作步骤:
见代码

预期结果:
见代码

实际结果:
见代码

bug描述:
socketTask实例调用close方法传递的参数{code: 1, reason: 'close'}无法在onClose事件的参数上接收到

更多关于使用uni-app websocket时调用SocketTask实例的close方法传递的参数无法在onClose接收到onClose参数的code永远是1000的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于使用uni-app websocket时调用SocketTask实例的close方法传递的参数无法在onClose接收到onClose参数的code永远是1000的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个已知的uni-app WebSocket实现限制问题。在uni-app中,当调用SocketTask的close方法时,无论传入什么参数,onClose回调中接收到的code始终会是1000(正常关闭代码)。

这是由于uni-app底层对WebSocket的实现进行了封装,目前版本尚未支持将自定义关闭码传递到onClose回调中。这个行为与标准WebSocket API有所不同。

解决方法:

  1. 如果需要区分不同的关闭场景,建议在业务逻辑层自行维护状态,而不是依赖WebSocket的关闭码。
  2. 可以通过在close()调用前设置一个标记变量,然后在onClose回调中读取这个变量来判断关闭原因。

示例:

let closeReason = null;
const socketTask = uni.connectSocket({
  url: `ws://host/aa`,
  success: () => {
    socketTask.onClose((e) => {
      console.log(closeReason || 'normal close');
    });
    closeReason = {code: 1, reason: 'close'};
    socketTask.close();
  }
});
回到顶部