函数柯里化实现请求拦截的核心是解耦拦截逻辑与业务请求,通过闭包封装配置(如token注入、重试、节流),支持预设、复用与组合;调用分两步:先固定拦截规则生成新函数,再传入业务参数自动执行拦截策略。

函数柯里化处理通用请求拦截,核心是把“拦截逻辑”和“业务请求”解耦,让拦截配置可复用、可预设、可组合,而不是每次发请求都重复写 header、重试、限流等代码。
用柯里化封装请求拦截器
把请求函数、拦截规则(如 token 注入、参数标准化)、重试策略打包成一个柯里化函数。调用时分两步:第一步固定拦截配置,第二步传入具体业务参数。
- 第一次调用传入原始 fetch 函数和通用拦截规则,返回一个“已装配拦截能力”的新函数
- 后续每次调用只传业务数据(如 userId、query),自动携带认证头、自动重试、自动节流
- 示例:
const apiUser = curryRequest(fetch, { auth: true, retry: 2, throttle: { window: 5000, max: 3 } }); apiUser({ id: 123 }).then(...)
支持动态参数与闭包状态管理
柯里化天然依赖闭包,适合保存拦截过程中的上下文,比如 token 刷新状态、失败计数、最近请求时间戳。
- token 过期时,可在柯里化内部触发刷新并重发原请求,调用方无感知
- 重试次数、延迟间隔可通过函数参数固化,也可传入回调函数实现动态计算(如指数退避)
- 节流窗口的计数器和时间戳存在闭包里,不污染全局变量,多个 API 实例互不影响
与 Proxy 或 axios 拦截器的区别
柯里化不是替代方案,而是补充手段:它更轻量、无框架依赖、适合细粒度控制单个函数行为。
- Proxy 拦截的是对象属性访问,适合统一代理整个 API 对象;柯里化拦截的是函数调用流程,适合定制某类请求
- axios.interceptors 是全局/实例级,一旦设置影响所有请求;柯里化可按需创建多个隔离实例(如 adminApi、guestApi)
- 柯里化函数返回 Promise,能自然融入 async/await 链,便于和现有业务代码融合
一个可运行的简化示例
以下是一个带 token 注入和简单重试的柯里化请求封装:
const curryRequest = (fn, options) => {return (args) => {
const config = {
headers: { ...options.headers, Authorization: `Bearer ${localStorage.getItem('token')}` },
...args
};
return fn(config).catch(err => {
if (options.retry > 0) {
return new Promise(r => setTimeout(r, 500))
.then(() => curryRequest(fn, { ...options, retry: options.retry - 1 })(args));
}
throw err;
});
};
};
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











