功能说明
classifyStatus 接收三位状态码,返回类别编号、类别标签以及成功、重定向、错误、可重试和可缓存等布尔值。isRetryableStatus 是只关心重试的快捷入口。它适合封装 fetch 客户端、统一错误提示、决定退避策略以及判断响应能否进入缓存。将状态语义集中在一处,可以避免各个调用点散落魔法数字。
关键代码
函数先校验状态码必须是 100 到 599 的整数,再用除以一百取整得到类别,并从映射表读取标签。可重试集合包含请求超时、Too Early、限流、内部错误、网关错误、服务不可用和网关超时;可缓存集合覆盖常见的成功响应、永久重定向以及 404 与 410。返回对象每次新建,调用方可安全扩展字段。
使用注意
可重试判断是通用启发式,实际重试还要看请求方法是否幂等、是否已有副作用以及业务错误体。429 与 503 应结合 Retry-After 头决定等待时间,不能立即密集重放。301 与 308 的可缓存性还受响应头约束,本表只表示允许缓存而非一定缓存。100 与 101 等中间状态通常不会出现在最终响应对象中。
验证方式
遍历 100、200、204、301、304、400、404、429、500、503 等代表值,断言类别、标签与布尔标记符合预期。测试 99、600、200.5 与字符串输入会抛错。检查 304 被归为成功之外的类别但不算错误,404 可缓存但不可重试。最后验证快捷函数与完整分类结果一致。
代码示例
const RETRYABLE = new Set([408, 425, 429, 500, 502, 503, 504]);
const CACHEABLE = new Set([200, 203, 204, 206, 300, 301, 308, 404, 410]);
export function classifyStatus(status) {
if (!Number.isInteger(status) || status < 100 || status > 599) {
throw new RangeError("status must be a three-digit HTTP status code");
}
const group = Math.floor(status / 100);
const labels = {
1: "informational",
2: "success",
3: "redirect",
4: "client-error",
5: "server-error",
};
return {
status,
group,
label: labels[group],
success: group === 2,
redirect: group === 3,
error: group >= 4,
retryable: RETRYABLE.has(status),
cacheable: CACHEABLE.has(status),
};
}
export function isRetryableStatus(status) {
return classifyStatus(status).retryable;
}