abortcontroller 中止请求需新建实例并传 signal 给 fetch,调用 controller.abort() 可取消;signal 一次性使用,不可复用或共享;现代浏览器广泛支持,旧环境可用 polyfill 或 xhr.abort()。

使用 AbortController 中止 JavaScript 请求,核心是创建控制器实例,将其 signal 传入 fetch(或其他支持 signal 的 API),再在需要时调用 controller.abort()。
创建并传入 signal
每次发起请求前新建一个 AbortController 实例,把它的 signal 属性作为选项传给 fetch:
const controller = new AbortController();
const signal = controller.signal;
fetch('/api/data', { signal })
.then(response => response.json())
.then(data => console.log(data))
.catch(err => {
if (err.name === 'AbortError') {
console.log('请求已被取消');
} else {
console.error('请求出错:', err);
}
});
手动触发中止
在任意时机(如用户点击取消按钮、组件卸载、超时等)调用 abort() 方法:
// 例如:3 秒后自动取消
setTimeout(() => controller.abort(), 3000);
// 或监听按钮点击
document.getElementById('cancel-btn').addEventListener('click', () => {
controller.abort();
});
注意 signal 的生命周期和复用限制
signal 是一次性使用的 —— 一旦 abort() 被调用,该 signal 就进入已中止状态,无法再次用于新请求。重复使用会抛出错误:
- 每次新请求必须新建
AbortController,不能复用旧实例 - 不要将同一个
signal传给多个fetch(虽然技术上可行,但中止会同时影响全部) - React/Vue 等框架中,通常在组件卸载(useEffect cleanup / beforeUnmount)里调用
abort()
兼容性与替代方案
AbortController 已被现代浏览器广泛支持(Chrome 66+、Firefox 57+、Edge 16+、Safari 12.1+)。若需兼容老旧环境:
- 可引入 polyfill(如
abort-controllernpm 包) - 传统
XMLHttpRequest可用xhr.abort(),但不推荐新项目使用 - Axios 也支持
signal(v0.22.0+),用法一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











