uni-app 运行到鸿蒙平台 断网情况下 连接socket onError回调重复触发

发布于 1周前 作者 sinazl 来自 Uni-App

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

7 回复

你好,刚才经过测试,没有发现这个问题,你看一下是否有其它影响呢?

更多关于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连接,以及如何根据具体的网络状态调整重试策略。

回到顶部