通过 abortcontroller 实例的 signal 属性传递给 fetch 或 xmlhttprequest,并在请求发起前或进行中调用 abort() 方法即可取消请求。实现缓存清理的关键在于:浏览器对已取消的请求通常不会将其响应写入 http 缓存(如 service worker 缓存或内存缓存),但为了确保彻底清理,应主动清除与该 url 相关的缓存条目或使用 cache api 删除对应资源。

如何使用 AbortController 取消 fetch 请求
使用 AbortController 可以优雅地取消正在进行的 fetch 请求。创建一个 AbortController 实例,获取其 signal 属性,并将其作为配置项传入 fetch 函数。当需要取消时,调用 controller.abort(),此时 fetch 会抛出一个 DOMException 错误,类型通常为 "AbortError"。这种方式不会将响应存入缓存,因为请求被中断了。

const controller = new AbortController();
const signal = controller.signal;
fetch('https://api.example.com/data', { signal })
.then(response => response.json())
.then(data => console.log(data))
.catch(error => {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
} else {
console.error('Fetch failed:', error);
}
});
// 在某个时刻取消请求
controller.abort();
如何手动清理与取消请求相关的缓存
虽然取消请求本身不会自动清理所有缓存,但可以通过 Cache API 手动删除特定 URL 的缓存条目。首先打开一个缓存存储,然后使用 delete 方法移除对应的请求对象。这确保了即使之前有缓存,也会被清除,避免后续请求使用过时的数据。

// 假设要清理的 URL
const url = 'https://api.example.com/data';
// 打开缓存存储
caches.open('my-cache').then(cache => {
// 删除特定 URL 的缓存
cache.delete(url).then(deleted => {
if (deleted) {
console.log('Cache cleared for:', url);
} else {
console.log('No cache found for:', url);
}
});
});
基于 AbortController 取消请求后是否影响后续相同 URL 的请求
当使用 AbortController 取消一个请求后,该请求的响应不会被缓存,因此后续对相同 URL 的请求会重新发起网络请求,而不是使用之前的缓存。这是因为取消操作阻止了响应的完整接收和缓存过程。如果需要确保每次请求都获取最新数据,可以在取消后显式清理缓存,或者在请求头中设置 no-cache 指令。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











