处理http请求超时需区分超时与网络中断:xhr用timeout+ontimeout捕获超时,onerror捕获断网;fetch用abortcontroller.abort()中止请求,catch识别aborterror;禁对4xx重试,离线时拦截请求,ui需及时反馈状态。

处理 HTTP 请求超时引发的中断异常,核心是区分“超时”和“网络中断”,并用对应机制捕获、中止、反馈。不能只靠 catch 捕获一个泛错误,而要主动控制请求生命周期。
XMLHttpRequest:用 timeout + ontimeout 明确捕获超时
原生 XHR 提供最直接的超时支持,适合需兼容旧环境或精细控制的场景:
- 设置
xhr.timeout = 5000(毫秒),从send()开始计时,到接收到第一个字节为止 - 绑定
xhr.ontimeout = () => { /* 提示用户、清除 loading 状态 */ },该回调仅在超时触发,不与onerror冲突 - 必须同时监听
xhr.onerror,用于捕获断网、DNS 失败等底层网络异常——它和超时是互补关系,不是重复逻辑
fetch:用 AbortController 实现可取消的超时中断
fetch 本身无 timeout 参数,但 AbortController 能真正中止请求、释放连接,更现代也更可控:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建控制器:
const controller = new AbortController() - 发起请求时传入 signal:
fetch(url, { signal: controller.signal }) - 启动定时器中断:
setTimeout(() => controller.abort(), 5000) - 在
catch中识别中断:if (err.name === 'AbortError') { /* 是超时中断,不是服务端错误 */ }
区分失败类型,避免误重试
超时中断(AbortError 或 ontimeout)和网络离线、4xx 错误性质完全不同,不能一概而论:
- 仅对超时和部分 5xx(如 502、503、504)考虑重试,说明服务暂时不可用
- 禁止对 4xx(400、401、403)重试——参数错、未登录、权限不足,重试毫无意义
- 前端检测到
navigator.onLine === false时,应直接拦截请求,不发包、不等待、不重试
UI 层及时反馈状态,防止用户困惑
超时不是静默失败,而是需要明确交互信号:
- 请求发出后立即显示 loading 状态,避免用户重复点击
- 超时触发时,清除 loading,提示“请求超时,请稍后重试”,并提供手动重试按钮
- 若已重试一次仍未成功,可降级展示缓存数据或空态文案,而非持续空白
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










