Axios 取消请求
Axios 的现代取消方式是 AbortController;旧的 CancelToken 已废弃。
#concept
#growing
#network
#browser
#http
#javascript
#axios
[!info] related notes
- 所属 MOC: HTTP 与前端网络请求
- 上位概念: Axios
- 前置概念: Axios 请求配置, Fetch API, AbortController 与异步取消
- 并列概念: Axios 错误模型
Axios 取消请求
一句话定义
Axios 通过 AbortController 的 signal 取消请求;老的 CancelToken 已经不建议新项目使用。
[!note] 边界
AbortController/AbortSignal的通用取消协议以 AbortController 与异步取消 为 canonical;本文只记录 Axios 如何接入该协议,以及 Axios 自身的取消错误与旧CancelToken兼容边界。
核心内容
推荐写法
const controller = new AbortController()
const request = axios.get('/users', { signal: controller.signal })
.catch(error => {
if (axios.isCancel(error)) return; // 预期取消
throw error;
})
controller.abort()
await request // 非取消错误继续向调用方传播
取消和超时不是一回事
timeout的覆盖阶段取决于 adapter 与运行环境,不应直接当作整个业务流程的截止时间。signal可由主动取消或超时信号触发;需要时组合两者。取消后的 signal 不可复用为新的未取消请求。
常见场景
- 搜索框连续输入时取消旧请求;仍需用请求序号等方式阻止已完成的旧响应覆盖新状态
- 路由切换时取消旧请求
- 组件卸载时终止飞行中的请求
- 上传/下载中断
边界与易混淆点
CancelToken自 Axios 0.22.0 起被弃用,不代表所有已发布版本都已删除此 API- Axios 取消通常表现为
CanceledError/ERR_CANCELED,不要只判断原生AbortError - 客户端取消不证明服务器任务已经停止,也不回滚已发生的写入
- 取消请求后应该把异常路径也纳入统一错误处理
timeout和abort往往要一起考虑
最短记忆方式
- 新方案:
AbortController - 旧方案:
CancelToken - 取消用于主动中断,请别和超时混为一谈