Fetch 本身不提供内置降级机制,需封装通用请求函数统一处理网络失败、超时、响应异常等场景,支持多级缓存(内存/LocalStorage)与兜底数据,并透传 isDegraded 标识。

Fetch 本身不提供内置的降级机制,要实现接口统一降级,核心思路是封装一层通用请求函数,在网络失败、超时、响应异常等场景下自动 fallback 到备用策略(如本地缓存、静态兜底数据、Mock 数据或降级接口)。
统一封装 fetch 请求函数
所有业务请求都走这个封装函数,便于集中控制降级逻辑。关键点包括:捕获网络错误、判断响应状态、设置超时、支持 fallback 回调或默认降级数据。
- 用 AbortController 控制超时和中断请求
- 用 try/catch 捕获网络异常(如断网、DNS 失败)
- 检查 response.ok 和 response.status 处理业务错误(如 4xx/5xx)
- 对特定错误码(如 503、408)或异常类型(TypeError、AbortError)触发降级
支持多级降级策略
降级不是“有或无”,而是按优先级逐层尝试:先查内存缓存 → 再读 localStorage 缓存 → 最后返回预设兜底数据。可结合业务灵活配置。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 内存缓存适合高频、短期不变的数据(如配置项),用 Map 或 WeakMap 管理
- localStorage 缓存需注意有效期(加时间戳校验),避免 stale data
- 兜底数据建议定义在请求配置中,例如:
fallback: { code: 0, msg: '服务暂不可用', data: {} }
与 Promise.finally 或自定义 Hook 结合使用(React 场景)
在 UI 层保持加载态、错误态、降级态的清晰区分,避免因降级导致状态混乱。
- 降级成功时仍应 resolve 正常数据结构,保证调用方无需额外判断
- 可透传一个
isDegraded: true字段,供 UI 做轻量提示(如“数据已降级,可能不实时”) - 搭配 React 的
useSWR或自定义 hook,把降级逻辑下沉,组件只关注 render
示例:简易可复用的降级 fetch 封装
以下是一个带超时、缓存、兜底的最小可行封装(不含第三方库):
async function safeFetch(url, options = {}) {
const { timeout = 8000, cacheKey, fallback = null, useCache = true } = options;
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeout);
<p>try {
// 先尝试读缓存
if (useCache && cacheKey) {
const cached = localStorage.getItem(cacheKey);
if (cached) {
const { data, expires } = JSON.parse(cached);
if (!expires || Date.now() </p><pre class="brush:php;toolbar:false;">const res = await fetch(url, { ...options, signal: controller.signal });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
// 成功后写入缓存(可选)
if (useCache && cacheKey) {
const expires = Date.now() + 5 * 60 * 1000; // 5 分钟过期
localStorage.setItem(cacheKey, JSON.stringify({ data, expires }));
}
return data;} catch (err) { if (err.name === 'AbortError') { console.warn('Request timeout, using fallback'); } else { console.warn('Network or parse error, using fallback', err); } return fallback ?? { code: -1, msg: '请求失败,请稍后重试', data: null }; } finally { clearTimeout(id); } }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










