Token过期时需挂起未响应请求并统一刷新,通过Promise队列、refreshingPromise和pendingRequests实现防并发、防重复;拦截器捕获401后暂存请求,刷新成功后重试并更新Header,失败则清空队列并拒绝所有请求。

Token 过期时,已发出但尚未响应的请求需要挂起,等新 Token 获取成功后再重试,避免重复刷新、竞态或 401 泛滥。核心是请求拦截 + 队列 + 状态管理,不是简单重发。
用 Promise 队列暂存待重试请求
当检测到 401(Token 失效)时,不立刻 reject,而是把当前请求的 resolve/reject 回调暂存进一个队列。所有后续同批 401 请求都加入该队列,只触发一次刷新逻辑。
- 维护一个 refreshingPromise:首次 401 时发起 refresh token 请求,并缓存其 Promise;后续请求直接 await 它,避免并发刷新
- 维护一个 pendingRequests 数组:存放 { config, resolve, reject } 对象,用于重试时重建请求
- 刷新成功后,遍历 pendingRequests,用新 Token 克隆 config(如更新 Authorization header),再用 axios 或 fetch 重新发起
在请求拦截器中统一捕获 401 并挂起
不要在每个接口里手动 try/catch 401。用 axios 的 response interceptor 统一处理:
基于官方 GMGN API 的代币分析工具。通过合约地址查询代币在 SOL/BSC/Base 链上的准确市场数据、安全检测、KOL 分析、开发者分析和 AI 智能分析(叙事/筹码/老鼠仓/机器人)。支持自动识别链。
- 收到 401 响应时,若无正在刷新,则调用 refreshToken() 并赋值给 refreshingPromise
- 将当前请求包装成 Promise,推入 pendingRequests,然后 return new Promise((r) => {...}) 暂停执行
- 注意:需克隆原始 config(如使用 axios.isAxiosError 判断,避免修改原请求对象)
刷新成功后逐个重放,失败则清空队列并拒绝所有请求
refreshToken() 成功后,用新 access_token 更新本地存储和请求默认 header,再依次重试 pendingRequests 中的请求:
立即学习“Java免费学习笔记(深入)”;
- 对每个 pending config,设置新的 Authorization: Bearer xxx
- 用原始 method、url、data、headers 重新发起(推荐用 axios.request(config) 保证一致性)
- 任一重试失败(如再次 401 或网络错误),清空 pendingRequests,对所有 pending promise 调用 reject,推动登录页跳转
避免死循环与边界问题
重试请求本身也可能 401 —— 必须设防:
- 给重试请求加标志位(如 config.__retry = true),拦截器识别后不再挂起,直接 reject
- 限制最大重试次数(例如原始请求 + 1 次重试),防止无限递归
- 刷新 token 接口本身不能走带鉴权的拦截器,否则会陷入“刷 token 需要 token”的死锁

















