JavaScript 中 Ajax 请求的取消令牌主要通过 AbortController 实现,它是现代浏览器原生支持的标准方式,用于主动中止 fetch 或 XMLHttpRequest 请求;fetch 原生支持 signal 选项,调用 controller.abort() 后立即抛出 AbortError;Axios 自 0.22.0 起也支持传入 signal;XMLHttpRequest 则需手动调用 xhr.abort() 兼容处理。

JavaScript 中 Ajax 请求的取消令牌,主要通过 AbortController 实现,它是现代浏览器原生支持的标准方式,用于主动中止 fetch 或 XMLHttpRequest 请求。
使用 AbortController 取消 fetch 请求
fetch API 原生支持 signal 选项,传入 AbortController.signal 即可关联取消逻辑。调用 controller.abort() 后,对应 fetch 会立即抛出 AbortError 异常。
- 创建控制器:
const controller = new AbortController(); - 发起请求时传入 signal:
fetch(url, { signal: controller.signal }) - 需要取消时调用:
controller.abort() - 捕获异常时检查是否因取消导致:
if (err.name === 'AbortError') { /* 被主动取消 */ }
封装带取消能力的请求函数
为避免每次手动创建和管理控制器,可封装一个返回 { promise, abort } 结构的工具函数:
- 内部新建 AbortController,将 signal 传给 fetch
- 返回 Promise,并暴露 abort 方法供外部调用
- 注意:abort 调用后 Promise 不会自动 resolve/reject,需靠 catch 捕获错误
- 示例:
const { promise, abort } = createAbortableFetch('/api/data');,后续可随时调用abort()
与 Axios 配合使用取消功能
Axios 1.x 版本使用 CancelToken(已废弃),从 0.22.0 开始全面支持 AbortController。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
立即学习“Java免费学习笔记(深入)”;
- 直接传入
signal字段:axios.get('/api/data', { signal: controller.signal }) - 取消行为与 fetch 一致,触发后 Promise reject 并抛出
AbortError - 注意 Axios 默认不屏蔽 AbortError,需在 .catch 中显式处理
XMLHttpRequest 中如何实现类似效果
XMLHttpRequest 本身没有 signal 机制,但可通过 xhr.abort() 手动终止请求,属于兼容方案:
- 保存 xhr 实例引用,便于后续调用
xhr.abort() - 调用 abort 后,xhr 的
readyState变为 0,status为 0 - 需自行维护请求状态、避免重复 abort 或对已完成请求调用 abort
- 不推荐新项目使用,优先选择 fetch + AbortController
AbortController 是当前最简洁、标准化的取消方案,兼容性覆盖所有现代浏览器(Chrome 66+、Firefox 65+、Safari 12.1+),无需额外依赖。

















