AbortController 是用于取消异步操作的工具,通过 signal 传递中止信号,调用 abort() 可终止 fetch 请求或自定义任务,避免资源浪费;每次操作应使用独立实例,需在 catch 中处理 AbortError,并在适当时机清理以防止内存泄漏。

在 JavaScript 中,AbortController 是一个用于取消异步操作的轻量级工具。它常用于终止正在进行的 fetch 请求,但也适用于其他可中断的任务,比如定时器或自定义 Promise 操作。通过它,开发者可以避免不必要的资源浪费和潜在的竞态条件。
AbortController 接口提供了一种方式来主动中止一个或多个 DOM 请求,例如 fetch 调用。每个 AbortController 实例都有一个 signal 属性,该信号可被传递给异步操作,以便监听是否触发了中止动作。
一旦调用控制器的 abort() 方法,其关联的 signal 就会触发,监听该信号的操作将收到通知并自行终止。
fetch API 原生支持 AbortSignal,是使用 AbortController 最常见的场景。
立即学习“Java免费学习笔记(深入)”;
// 创建一个 AbortController 实例
const controller = new AbortController();
// 获取其 signal
const signal = controller.signal;
// 发起 fetch 请求并传入 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);
}
});
// 在需要时取消请求
controller.abort(); // 触发中止
调用 abort() 后,fetch 会以 AbortError 拒绝 Promise,可以在 catch 中识别并处理这种特殊情况。
除了 fetch,你也可以在自己的异步逻辑中响应中止信号。比如处理长时间运行的任务或轮询操作。
function delayedTask(signal, delay) {
return new Promise((resolve, reject) => {
if (signal.aborted) {
return reject(new Error('任务已被中止'));
}
const timer = setTimeout(() => {
console.log('任务完成');
resolve();
}, delay);
// 监听中止事件
signal.addEventListener('abort', () => {
clearTimeout(timer);
reject(new Error('任务被手动取消'));
});
});
}
// 使用示例
const controller = new AbortController();
delayedTask(controller.signal, 5000).catch(e => console.log(e.message));
// 取消任务
controller.abort();
这种方式让你对自定义异步流程拥有更好的控制力,尤其是在用户交互频繁、可能频繁切换状态的应用中非常有用。
使用 AbortController 时注意以下几点:
基本上就这些。AbortController 虽小,但在管理异步操作生命周期方面非常强大,合理使用可以让应用更高效、响应更及时。
以上就是JavaScript AbortController:取消正在进行的异步操作的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号