uni-app 运行到鸿蒙平台 断网情况下 连接socket onError回调重复触发
uni-app 运行到鸿蒙平台 断网情况下 连接socket onError回调重复触发
项目属性 | 值 |
---|---|
产品分类 | uniapp/App |
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | mac os 11.4 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.24 |
手机系统 | HarmonyOS NEXT |
手机系统版本号 | HarmonyOS NEXT Developer Beta1 |
手机厂商 | 华为 |
手机机型 | Mate 60 |
页面类型 | vue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
示例代码:
const conn = uni.connectSocket({
url:'wss://xxxxx/ws',
success:() =>{
console.log('conn success IM SDK')
}
})
conn.onError((e) =>{
// 断网情况下发起连接,该回调重复触发2次。 直接用鸿蒙启动websocket没问题
console.log(e, 'IM SDK UNI Error')
})
操作步骤:
断网情况下, 发起socket连接, onError回调重复触发2次。 (备注: 直接用鸿蒙平台代码测试,没有问题)
预期结果:
断网情况下, 发起socket连接, onError回调重复触发1次。
实际结果:
断网情况下, 发起socket连接, onError回调重复触发2次。
bug描述:
uniapp 运行到鸿蒙平台,断网情况下, 连接socket , onError回调重复触发,
直接用鸿蒙起一个websocket不会重复触发onError回调。
更多关于uni-app 运行到鸿蒙平台 断网情况下 连接socket onError回调重复触发的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
您是在真机测试的么?
我在真机测试有遇到这个问题
回复 rexcoder: 你好,我们之后会测试一下
回复 DCloud_UNI_yuhe: 谢谢
回复 DCloud_UNI_yuhe: 手机升级到beta3版本,还是会重复回调2次
在将uni-app应用运行到鸿蒙平台时,如果在断网情况下连接socket,确实可能会遇到onError
回调重复触发的问题。这通常是由于网络状态的不稳定或socket库本身的处理机制导致的。为了处理这种情况,我们需要确保在socket连接失败时能够正确地进行重试控制,并避免过多的错误回调触发。
以下是一个处理此类问题的示例代码,它使用了uni-app的socket API,并结合了重试机制来控制onError
回调的触发次数:
// 定义一个重试次数限制
const MAX_RETRY_COUNT = 5;
let retryCount = 0;
// 创建socket连接
const socket = uni.connectSocket({
url: 'ws://your.socket.server.url',
success: function () {
console.log('Socket连接成功');
},
fail: function (err) {
console.error('Socket连接失败', err);
// 检查是否已达到最大重试次数
if (retryCount < MAX_RETRY_COUNT) {
retryCount++;
// 延迟一段时间后重试
setTimeout(() => {
createSocketConnection();
}, 3000); // 延迟3秒重试
} else {
console.error('已达到最大重试次数,放弃连接');
}
}
});
// 监听socket错误事件
socket.onError(function (err) {
console.error('Socket错误', err);
// 这里不再进行重试,因为已经在连接失败时进行了处理
// 如果需要,可以根据具体需求调整重试逻辑
});
// 监听socket关闭事件
socket.onClose(function () {
console.log('Socket已关闭');
// 如果需要,可以在这里添加重新连接的逻辑
});
// 发送消息的函数(示例)
function sendMessage(message) {
if (socket.readyState === uni.SocketReadyState.OPEN) {
socket.send({
data: message
});
} else {
console.error('Socket未打开,无法发送消息');
}
}
// 初始化socket连接的函数
function createSocketConnection() {
// 重置重试次数
retryCount = 0;
// 重新创建socket连接(这里可以优化为复用socket对象,根据实际需求调整)
socket.close(); // 先关闭当前的socket连接(如果存在)
// 然后重新执行上面的socket创建代码(这里为了简洁,未重复写出)
// ...(实际上,这里应该再次调用uni.connectSocket并设置相关事件监听)
}
// 初始调用创建socket连接
createSocketConnection();
请注意,上述代码示例为了简洁性,并未完全展示如何复用socket对象。在实际应用中,你可能需要设计一个更复杂的socket管理机制,包括如何优雅地关闭和重新打开socket连接,以及如何根据具体的网络状态调整重试策略。