uni-app无全局默认超时,timeout必须显式写在每个uni.request中才生效;manifest.json的networktimeout仅为未设timeout时的兜底值,修改后须重启项目且结构须为"networktimeout": {"request": 10000}。

uni-app 没有“全局默认超时时间”可一键修改,timeout 必须显式写在每个 uni.request 调用里才真正生效;manifest.json 中的 networkTimeout 仅是未设 timeout 时的兜底值,且修改后必须重启项目。
为什么直接改 manifest.json 的 networkTimeout 不总起作用
很多人改完 manifest.json 发现请求还是等了 60 秒才超时,根本原因是:
-
networkTimeout只对「没写timeout字段」的uni.request生效;只要代码里写了timeout: 5000,它就完全无视manifest.json - 改完
manifest.json必须重启 HBuilderX 或命令行服务(npm run dev:mp-weixin等),热重载不识别新配置 - iOS 真机上 NSURLSession 底层行为会导致实际超时比设置值多 1–2 秒,比如设 10000ms,实测可能 11500ms 才触发
-
networkTimeout是对象结构,必须写成"networkTimeout": { "request": 10000 },漏掉大括号或写成networktimeout(大小写错)都会失效
uni.request 里 timeout 参数怎么写才可靠
这是唯一能 100% 控制单次请求超时的方式。关键不是“能不能设”,而是写法是否严谨:
- 必须是数字类型,单位毫秒:
timeout: 8000✅,timeout: "8000"❌(字符串不生效) - 避免传
null或undefined:timeout: options.timeout ?? 5000比timeout: options.timeout更安全 - H5 平台下
timeout不会中断请求,只影响fail回调提示;真要控制 H5 超时,得靠AbortController手动 abort(但uni.request不支持,需换原生fetch) -
uni.uploadFile完全不支持timeout参数,上传类请求必须用uni.request+FormData手动实现,才能加超时
如何判断一次失败真是超时而不是其他错误
不同平台返回的 errMsg 差异极大,不能只认 'request:fail timeout':
- Android / 微信小程序:基本稳定返回
request:fail timeout - iOS 真机:可能返回
request:fail net::ERR_CONNECTION_TIMED_OUT或request:fail abort - H5:多数时候不进
fail,而是进success但res.statusCode === 0 - 推荐统一判断逻辑:
err.errMsg?.includes('timeout') || res?.statusCode === 0 - 更稳妥的做法是在
complete回调里用时间戳比对:发起请求时记const start = Date.now(),complete时算差值,超过阈值就当超时处理
弱网下 timeout 值该怎么定
设成统一 10 秒或 30 秒是典型误区。真实场景中,不同接口容忍度天差地别:
- 登录类接口(
login):用户愿意等,但也不该太久,建议timeout: 15000 - 图片上传(
uploadFile):必须用uni.request手动实现,超时至少设120000(2 分钟) - 首页 Banner(
getBannerList):内容非关键,3 秒无响应就该失败+重试,设timeout: 3000 - 千万别在封装函数里写死
timeout: 5000然后到处复用——一个参数撑全场,迟早出问题
最易被忽略的一点:超时和重试是两件事。超时只是中断当前请求,而是否重试、重试几次、间隔多久,必须结合错误类型(401 不该重试,503 可以)和业务语义单独设计,不能靠 timeout 值本身做决策。











