一、代码示例
示例 1:手动取消 fetch 请求
// 创建控制器
const controller = new AbortController();
const signal = controller.signal;
// 发起请求并绑定中断信号
fetch('/api/data', { signal })
.then(res => res.json())
.then(data => console.log(data))
.catch(err => {
// 区分手动取消与其他网络错误
if (err.name === 'AbortError') {
console.log('请求已手动取消');
} else {
console.log('其他网络错误', err);
}
});
// 任意时机执行即可终止请求(切换页面、取消按钮点击等场景)
controller.abort('用户主动取消');示例 2:超时自动中断(极简写法)
无需手动创建控制器,内置超时逻辑:
// 3秒无响应自动中断请求
fetch('/api/list', {
signal: AbortSignal.timeout(3000)
}).catch(err => {
if (err.name === 'TimeoutError') {
console.log('请求超时');
}
});示例 3:批量取消 DOM 事件监听
解决页面销毁后事件残留导致的内存泄漏,无需手动执行 removeEventListener:
const controller = new AbortController();
const signal = controller.signal;
function handleScroll() {
console.log(window.scrollY);
}
window.addEventListener('scroll', handleScroll, { signal });
// 组件/页面卸载时统一取消所有绑定该signal的监听
controller.abort();示例 4:封装可中断自定义 Promise(延时任务)
适配自定义异步任务,绑定中断信号:
function delay(ms, signal) {
return new Promise((resolve, reject) => {
const timer = setTimeout(resolve, ms);
// 监听中断信号
signal.addEventListener('abort', () => {
clearTimeout(timer);
reject(new Error('任务被中断'));
});
});
}
// 使用方式
const ctrl = new AbortController();
delay(5000, ctrl.signal).catch(e => console.log(e.message));
ctrl.abort(); // 立即终止延时任务示例 5:单信号批量取消多个请求
一个 signal 绑定多个 fetch,一次 abort 全部终止:
const controller = new AbortController();
const { signal } = controller;
Promise.all([
fetch('/api/user', { signal }),
fetch('/api/order', { signal })
]);
controller.abort(); // 同时终止两个接口请求二、业务实用场景
搜索框防抖:连续输入时取消上一轮未完成请求,防止旧接口数据覆盖新搜索结果
路由页面跳转:销毁当前页面所有 pending 接口,减少无效网络消耗
文件上传 / 大文件下载:用户点击取消,立刻断开网络请求
接口超时统一管控:替代手动定时器实现请求超时拦截
前端组件销毁(Vue/React):卸载组件时清除请求、滚动 / 点击事件,规避内存泄漏、组件已销毁仍更新状态报错
三、关键核心特性
单次触发:abort () 仅第一次调用生效;signal 一旦标记 aborted 为 true,永久不可恢复
信号复用:同一个 signal 可同时绑定多个 fetch、事件监听,一次 abort 批量中断全部任务
原生标准:浏览器内置 API,无第三方依赖;仅现代浏览器支持,IE 完全不兼容
错误类型区分:手动取消抛出 AbortError,超时自动中断抛出 TimeoutError,便于业务分支处理
四、与旧版取消方案对比
XMLHttpRequest:自带 xhr.abort (),但仅能取消自身请求,无法统一批量管理
定时器:仅能单独 clearTimeout,多任务无法统一中断
AbortController 优势:统一规范所有异步任务的中断逻辑,一套 API 管理请求、事件、自定义异步操作

发表评论