使用 fetch 实现故障转移的核心做法是:在发起请求前预先准备好备用 url,利用 promise 的竞态特性(如 promise.race)或重试逻辑,让主接口失败时自动切换至备用接口。具体而言,可以构造一个包含主备地址的请求数组,通过拦截器或封装函数捕获网络异常,一旦主请求抛出错误,立即触发对备用地址的调用并返回其结果。若需确保数据一致性,建议结合超时控制与状态码校验,避免将正常的业务错误误判为网络故障。

如何配置多端点并行请求以获取最快响应
要实现基于速度的故障转移,应同时发起多个 fetch 请求,并使用 Promise.race 等待最先完成且成功的请求。这种方法适用于主备节点位于不同地理位置或负载均衡场景,能够自动选择延迟最低的可用服务。关键在于处理“部分成功”的情况:如果最快的请求返回了 HTTP 错误(如 404 或 500),不应直接视为成功,而应继续等待其他请求或进入重试流程。

const endpoints = [
'https://api-primary.example.com/data',
'https://api-backup.example.com/data'
];
async function fetchWithFailover(urls) {
const requests = urls.map(url =>
fetch(url).then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
);
// 尝试所有请求,直到有一个成功
for (const req of requests) {
try {
return await req;
} catch (err) {
console.warn('Primary failed, trying next...', err.message);
}
}
throw new Error('All endpoints failed');
}
// 实际调用
fetchWithFailover(endpoints)
.then(data => console.log('Success:', data))
.catch(err => console.error('Total failure:', err));
上述代码定义了 endpoints 数组,依次尝试每个地址。第一个请求失败后,循环进入下一个,直到获取有效 JSON 数据或全部耗尽。这种方式比并行竞态更可控,因为它允许按优先级顺序回退,而不是随机选择最快的那个。预期结果是:当主端点不可达时,控制台先打印警告信息,随后输出备用端点的成功数据;若两者均失效,则抛出总失败异常。
如何在请求层统一处理超时与重试逻辑
在请求层统一处理超时与重试,可以通过封装一个高阶函数来实现,该函数接受原始 fetch 调用、最大重试次数和超时时间作为参数。每次请求启动时设置定时器,若在规定时间内未收到响应则主动取消请求并触发重试机制。这种模式适合应对间歇性网络抖动或服务端短暂过载,能有效提升系统的鲁棒性。

async function robustFetch(url, options = {}, maxRetries = 2, timeout = 5000) {
let lastError;
for (let attempt = 0; attempt controller.abort(), timeout);
try {
const response = await fetch(url, { ...options, signal: controller.signal });
clearTimeout(id);
if (!response.ok) throw new Error(`Status ${response.status}`);
return await response.json();
} catch (error) {
clearTimeout(id);
lastError = error;
if (attempt === maxRetries) break;
// 可选:添加指数退避 delay
}
}
throw lastError;
}
// 使用示例
robustFetch('https://api.example.com/resource')
.then(console.log)
.catch(e => console.error('Retry exhausted:', e));
此段代码引入了 AbortController 来精确控制超时行为,避免资源泄漏。循环结构支持最多 maxRetries 次额外尝试,每次失败后记录错误并在最后一次尝试后抛出。预期行为是:若首次请求因超时报错,系统会自动重试两次;若三次均失败,最终抛出最后一次捕获的异常。开发者可根据实际需求调整超时阈值和重试策略,例如针对特定 HTTP 状态码跳过重试。
当备用接口返回空数据时应如何处理
当备用接口返回空数据(如空数组或 null)时,故障转移逻辑不应仅依赖 HTTP 状态码判断成功,还需验证响应内容的有效性。建议在解析 JSON 后增加内容校验步骤,若发现数据为空,可视为隐性失败并继续尝试其他备用源或返回默认值。这种做法防止了“假成功”导致前端展示空白界面,提升了用户体验的一致性。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











