Appearance
前端 API 接口集成的高可用设计模式
解决前端调用后端接口时常见的异步处理缺陷:通过一套标准化的模式,消除竞态条件(Race Conditions)、防止重复请求并实现健壮的错误恢复机制。
为什么需要这个技能
大多数前端 Bug 并非源于 API 调用本身,而是源于对异步行为处理不当。例如:在快速切换页面时,旧请求的响应在后到达,覆盖了新请求的数据(竞态条件);或者在用户连续输入时触发大量重复请求,导致界面闪烁且服务器压力剧增。
本技能旨在将 API 调用从简单的 fetch 升级为具有“弹性”的集成层,确保应用在不稳定网络环境下依然能提供流畅的用户体验。
适用场景
- 构建基于 React、Vue 或 React Native 的企业级应用。
- 集成 ML/AI 推理端点(如
/predict),处理高延迟响应。 - 修复 UI 闪烁、数据过期或请求重复等异步相关 Bug。
- 设计可扩展的前端 API 服务层,统一错误处理逻辑。
核心工作流
1. 构建标准 API 层
不直接在组件中写 fetch,而是通过统一的客户端处理错误标准化和响应解析。
js
export class ApiError extends Error {
constructor(message, status, payload = null) {
super(message);
this.name = "ApiError";
this.status = status;
this.payload = payload;
}
}
export const apiClient = async (url, options = {}) => {
const res = await fetch(url, {
headers: { "Content-Type": "application/json" },
...options,
});
if (!res.ok) {
let payload = null;
try {
payload = await res.json();
} catch (_) {}
throw new ApiError(
payload?.message || "Request failed",
res.status,
payload
);
}
if (res.status === 204) return null;
const text = await res.text();
return text ? JSON.parse(text) : null;
};2. 消除竞态条件与请求取消
使用 AbortController 在组件卸载或依赖项更新时取消在途请求,避免过期数据污染状态。
js
useEffect(() => {
const controller = new AbortController();
const load = async () => {
try {
const data = await getUser({ signal: controller.signal });
setData(data);
} catch (err) {
if (err.name === "AbortError") return;
setError(err.message);
}
};
load();
return () => controller.abort();
}, [userId]);3. 实现指数退避重试
仅针对 5xx 服务器错误或网络中断进行重试,避免对 4xx 客户端错误进行无效请求。
js
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const fetchWithBackoff = async (fn, retries = 3, delay = 300) => {
try {
return await fn();
} catch (err) {
const isAbort = err.name === "AbortError";
const isHttpError = typeof err.status === "number";
const isRetryable = !isAbort && (!isHttpError || err.status >= 500);
if (retries <= 0 || !isRetryable) throw err;
const nextDelay = delay * 2 + Math.random() * 100;
await sleep(nextDelay);
return fetchWithBackoff(fn, retries - 1, nextDelay);
}
};4. 请求去重与防抖
通过 Map 缓存在途 Promise,防止同一时刻触发多个完全相同的 API 调用。
js
const inFlight = new Map();
export const dedupedFetch = (key, fn) => {
if (inFlight.has(key)) return inFlight.get(key);
const promise = fn().finally(() => inFlight.delete(key));
inFlight.set(key, promise);
return promise;
};下载和安装
下载 frontend-api-integration-patterns 中文版 Skill ZIP
解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md。
你可能还需要
暂无推荐