容灾降级的关键是请求粒度隔离与各自兜底:每个接口独立加.catch()返回默认值;并行请求用promise.allsettled;仅网络异常(超时、failed to fetch等)才降级,配合abortcontroller和主备切换;失败后保留上下文支持无感重试。

多个接口独立报错时,容灾降级的关键不是“统一捕获后重试”,而是让每个请求彼此隔离、各自兜底,失败不传染、数据可退场、体验不中断。
按请求粒度做独立错误处理
每个接口调用都应自带容错逻辑,避免一个失败拖垮全部。最直接的方式是为每个 fetch 或 axios 请求单独加 .catch(),转成可控的默认值:
const user = await fetch('/api/user').then(r => r.json()).catch(() => null)const config = await fetch('/api/config').then(r => r.json()).catch(() => ({ theme: 'light' }))- 这样即使用户接口失败,配置仍能加载,页面主体功能不受影响
用 Promise.allSettled 实现并行+全量执行
当多个接口语义上并列(如同时拉取头像、消息数、未读通知),推荐用 Promise.allSettled 替代 Promise.all:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 它保证所有请求都会执行完毕,不会因某一个 reject 而中止其余请求
- 返回数组中每个元素含
status(fulfilled 或 rejected)和对应value或reason - 便于统一判断:成功则渲染数据,失败则展示占位或空状态,不抛异常、不跳转
区分错误类型,只对网络异常降级
不是所有报错都要 fallback——401、404、500 是业务或服务端问题,应走登录态校验或提示用户;只有超时、TypeError: Failed to fetch、AbortError 等才属于真实网络异常,才启动备用地址或离线缓存:
- 用
AbortController设置 8s 超时,超时后明确标记为网络问题 - 主备地址切换仅在判定为网络异常后触发一次,避免反复轮询加重负担
- 本地 localStorage 可缓存非敏感兜底数据(如上次获取的菜单、主题设置),网络恢复后再异步刷新
失败后保留上下文,支持无感重试
用户看到“加载失败”时,不该只给个刷新按钮,而要降低操作成本:
- 自动记录失败请求的 URL、参数、时间戳,点击重试时原样发起
- 表单类操作需缓存用户已填内容(
localStorage或内存对象),避免重试时重新输入 - 关键操作(如提交订单)加幂等 ID(
X-Idempotency-Key),防止重复提交引发状态错乱
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










