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底层网络实现机制不同,导致超时错误信息格式不一致。
问题分析:
- Android端:uni-app底层使用原生网络库,超时错误会明确包含"timeout"关键字
- iOS端:底层网络请求实现方式不同,超时错误只返回通用错误信息,缺少具体超时标识
解决方案:
- 统一错误处理逻辑:
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);
}
}
});
- 使用状态码判断: 由于iOS超时返回statusCode为-1,可以结合状态码进行判断:
const handleRequestError = (res) => {
if (res.statusCode === -1) {
// 可能是超时或其他网络错误
// 可以结合其他条件进一步判断
return 'timeout_or_network_error';
}
return 'other_error';
}
- 封装统一请求方法: 建议封装统一的请求方法,在内部处理平台差异:
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);
}
});
});
};

