Ajax异常与超时需区分处理:超时是请求发出无响应,网络异常是根本发不出;XMLHttpRequest用timeout/onTimeout/onError分别捕获;fetch用AbortController实现可取消超时;重试仅限超时和5xx,禁用4xx重试;UI需实时反馈状态。

处理 Ajax 请求的网络异常与超时错误,核心是分开识别两类问题:超时是请求发出去了但迟迟没响应;网络异常是根本发不出去(比如断网、DNS失败、连接被拒)。两者触发机制不同,应对方式也必须区分,不能混为一谈。
原生 XMLHttpRequest:用 timeout + ontimeout + onerror 三者配合
XMLHttpRequest 提供最直接的控制能力:
- 设置 xhr.timeout = 5000(单位毫秒),从
send()开始计时,直到收到第一个字节为止;超时后自动触发ontimeout回调 - ontimeout 专门处理“等太久了”,此时可提示“请求超时,请稍后重试”,并恢复按钮状态
- onerror 捕获底层链路问题,如断网、跨域拒绝、SSL失败等;它和 ontimeout 互不触发,必须单独监听
- 注意:
status === 0且readyState === 4通常意味着网络异常(而非服务端返回 0 状态码),可作为辅助判断
fetch API:靠 AbortController 实现真正可取消的超时
fetch 本身没有 timeout 参数,但结合 AbortController 能做到更精准的中断:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建控制器:
const controller = new AbortController() - 发起请求时传入 signal:
fetch(url, { signal: controller.signal }) - 用
setTimeout(() => controller.abort(), 5000)主动中止 - 在 catch 中检查
err.name === 'AbortError',确认是超时中断而非其他错误 - 优势在于:除超时外,还能在用户离开页面、切换 Tab 或点击取消时主动调用
controller.abort(),避免无效请求堆积
重试逻辑要克制,不是所有失败都该重试
盲目重试会加重后端压力,还可能误导用户:
立即学习“Java免费学习笔记(深入)”;
- 只对 超时(AbortError / ontimeout) 和部分 5xx 临时错误(如 502、503、504)重试,间隔建议 1–2 秒,最多 2 次
- 禁止对 4xx 错误(如 400、401、403)重试——参数错、未登录、没权限,重发毫无意义
- 前端检测到
navigator.onLine === false时,应直接拦截请求,不发包、不等待、不重试 - 推荐采用简单指数退避:第 1 次重试延 1s,第 2 次延 2s,避免请求雪崩
UI 层必须同步反馈,让用户始终知情
用户不需要懂技术细节,但需要明确知道系统在做什么:
- 点击按钮后立即禁用,并显示“加载中…”或旋转图标,防止重复提交
- 超时或网络异常后,按钮恢复为“重试”状态,而不是持续禁用;点击重试前建议再次校验网络或登录态
- 非关键请求(如日志上报、推荐接口)可设更短超时(2–3 秒),不影响主流程体验

















