AJAX(Asynchronous JavaScript and XML)允许浏览器异步发送HTTP请求。当需要取消正在进行的请求时(例如用户主动取消操作或组件卸载),需使用中止机制。
现代方案主要依赖以下两种API:
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data');
xhr.send();
// 中止请求
xhr.abort();
const controller = new AbortController();
const signal = controller.signal;
fetch('https://api.example.com/data', { signal })
.then(response => response.json())
.catch(err => {
if (err.name === 'AbortError') {
console.log('请求已中止');
} else {
console.error('请求错误', err);
}
});
// 中止请求
controller.abort();
问题1:中止后控制台报错
.catch(err => {
if (err.name === 'AbortError') return;
// 处理其他错误
});
问题2:重复请求未正确中止
let currentController;
function fetchData() {
currentController?.abort();
currentController = new AbortController();
return fetch(url, {
signal: currentController.signal
});
}
问题3:兼容性问题
<script src="https://cdn.jsdelivr.net/npm/abortcontroller-polyfill/dist/abortcontroller-polyfill-only.min.js"></script>
useEffect(() => {
const controller = new AbortController();
fetchData(controller.signal);
return () => controller.abort();
}, []);
const timeoutId = setTimeout(() => controller.abort(), 5000);
fetch(url, { signal: controller.signal })
.finally(() => clearTimeout(timeoutId));
const source = axios.CancelToken.source();
axios.get(url, { cancelToken: source.token });
source.cancel('Operation canceled');
通过合理使用中止机制,可以有效提升应用性能和用户体验,避免不必要的网络流量消耗和潜在的内存泄漏问题。
没有搜到相关的沙龙