uni-app中uni.request请求超时后,ios和android响应errMsg不一致,ios下缺少timeout关键字

uni-app中uni.request请求超时后,ios和android响应errMsg不一致,ios下缺少timeout关键字

类别 信息
产品分类 uniapp/App
PC开发环境 Mac
操作系统版本 macOS Big Sur 11.2.3
HBuilderX类型 正式
HBuilderX版本 3.2.6
手机系统 iOS
手机系统版本 IOS 14
手机厂商 苹果
手机机型 iPhone 12
页面类型 vue
打包方式 云端
项目创建方式 HBuilderX

示例代码:

<template>  
    <button>测试</button>  
</template>  

<script>  
    export default {  
        methods: {  
            test() {  
                uni.request({  
                    url: "https://m.baidu.com", //仅为示例,并非真实接口地址。  
                    timeout: 50,  
                    fail: (res) => {  
                        console.log("fail", res);  
                    },  
                    success: (res) => {  
                        console.log("success", res);  
                    },  
                    complete: (res) => {  
                        console.log("complete", res);  
                    },  
                });  
            }  
        }  
    }  
</script>

操作步骤:

  • 模拟器运行,查看控制台输出

预期结果:

  • ios 和 android 行为一致

实际结果:

  • ios 和 android 行为不一致

bug描述:

uni.request 请求超时后,ios 和 android 响应 errMsg 不一致,ios下缺少 timeout 关键字

目前app业务需要更具网络超时,网络异常,断网等做场景做容错处理

安卓:

16:09:41.157 fail, [Object] {"errMsg":"request:fail abort statusCode:-1 timeout"}  at pages/timeout/timeout.vue:13  
16:09:41.188 complete, [Object] {"errMsg":"request:fail abort statusCode:-1 timeout"}  at pages/timeout/timeout.vue:19

苹果:

16:15:37.750  fail, [Object] {"errMsg":"request:fail abort statusCode:-1"}  at pages/timeout/timeout.vue:13   
16:15:37.777  complete, [Object] {"errMsg":"request:fail abort statusCode:-1"}  at pages/timeout/timeout.vue:19 

更多关于uni-app中uni.request请求超时后,ios和android响应errMsg不一致,ios下缺少timeout关键字的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

目前是存在平台差异,后期可能会修复此问题

更多关于uni-app中uni.request请求超时后,ios和android响应errMsg不一致,ios下缺少timeout关键字的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个已知的跨平台差异问题。iOS和Android底层网络实现机制不同,导致超时错误信息格式不一致。

问题分析:

  1. Android端:uni-app底层使用原生网络库,超时错误会明确包含"timeout"关键字
  2. iOS端:底层网络请求实现方式不同,超时错误只返回通用错误信息,缺少具体超时标识

解决方案:

  1. 统一错误处理逻辑
uni.request({
    url: "https://m.baidu.com",
    timeout: 50,
    fail: (res) => {
        const errMsg = res.errMsg || '';
        const isTimeout = errMsg.includes('timeout') || 
                         (res.statusCode === -1 && !errMsg.includes('其他错误标识'));
        if (isTimeout) {
            // 超时处理逻辑
            console.log("请求超时");
        } else {
            // 其他错误处理
            console.log("其他错误", res);
        }
    }
});
  1. 使用状态码判断: 由于iOS超时返回statusCode为-1,可以结合状态码进行判断:
const handleRequestError = (res) => {
    if (res.statusCode === -1) {
        // 可能是超时或其他网络错误
        // 可以结合其他条件进一步判断
        return 'timeout_or_network_error';
    }
    return 'other_error';
}
  1. 封装统一请求方法: 建议封装统一的请求方法,在内部处理平台差异:
const requestWithTimeoutHandler = (options) => {
    return new Promise((resolve, reject) => {
        uni.request({
            ...options,
            success: resolve,
            fail: (err) => {
                // 统一处理超时识别
                const isTimeout = err.errMsg?.includes('timeout') || 
                                 (err.statusCode === -1);
                if (isTimeout) {
                    err.errorType = 'timeout';
                }
                reject(err);
            }
        });
    });
};
回到顶部