abortcontroller 是 javascript 中用于协作式取消异步操作的原生工具,通过 signal 通知目标操作中止,需目标主动配合;支持 fetch 原生取消,可手动封装延时等自定义取消逻辑,并协调多关联任务状态。

AbortController 是 JavaScript 中用于主动中止异步操作的原生工具,常用于取消 fetch 请求、DOM 事件监听、setTimeout/setInterval 等。它本身不“拦截”操作,而是通过信号(signal)通知目标操作“应该停止”,由目标操作内部配合实现取消逻辑。
用 AbortController 取消 fetch 请求(最常见场景)
fetch 原生支持 signal 选项。一旦调用 controller.abort(),对应请求会立即终止,并抛出 AbortError(非网络错误,不会触发 catch 中的常规错误处理逻辑)。
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
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.error('其他错误:', err);
}
});
// 2 秒后取消请求
setTimeout(() => controller.abort(), 2000);
手动配合 AbortSignal 实现自定义操作取消
不是所有异步操作都原生支持 signal,但你可以用 signal.aborted 状态 + signal.addEventListener('abort', ...) 主动检查或响应中止。
比如封装一个可取消的延时函数:
function cancellableTimeout(callback, ms, signal) {
const timeoutId = setTimeout(() => {
if (!signal.aborted) callback();
}, ms);
signal.addEventListener('abort', () => {
clearTimeout(timeoutId);
}, { once: true });
}
// 使用
const controller = new AbortController();
cancellableTimeout(() => console.log('执行了'), 5000, controller.signal);
// 1 秒后取消
setTimeout(() => controller.abort(), 1000); // 不会打印
取消多个关联操作(如请求 + UI 状态)
实际项目中,取消请求往往还需同步清理 UI(如关闭 loading、恢复按钮状态)。AbortController 的 signal 可被多个地方监听,适合统一协调。
- 创建 controller 后,把 signal 传给 fetch 和 UI 控制逻辑
- 在 abort 事件中重置按钮禁用状态、隐藏加载动画、清空临时数据
- 避免因请求取消后状态残留导致用户误操作或内存泄漏
注意事项与常见误区
- AbortController 不是万能拦截器:它不能强行中断正在运行的同步代码(如长循环),只能协作式取消——目标操作必须主动检查 signal 或使用原生支持 signal 的 API
-
每个 controller 对应一次独立生命周期:abort 后 signal 保持
aborted === true,不可复用;需新操作就新建 controller -
避免忘记清理事件监听器:尤其在手动监听 'abort' 时,建议加
{ once: true }或在 abort 后显式 removeEventListener - 注意 Promise 状态:已 resolve/reject 的 Promise 不会因 abort 改变状态;abort 影响的是尚未完成的操作本身
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










