最可靠的方式是判断错误对象的 name 属性是否等于 'AbortError'。因为 fetch 取消时抛出的是 DOMException 类型的 AbortError,其 name 恒为 'AbortError',message 和其他属性不可靠;应避免依赖 message、signal.aborted 或 response 状态来判断。

直接看错误对象的 name 属性是否等于 'AbortError',这是最可靠、最标准的判断方式。
为什么只看 name === 'AbortError'?
当 fetch 请求被 AbortController 取消时,它不会抛出普通网络错误或超时错误,而是明确抛出一个类型为 AbortError 的 DOMException。这个错误有固定特征:
-
name 值恒为字符串
'AbortError' -
message 通常是
'The user aborted a request.'(不同浏览器可能略有差异,但 name 绝对一致) - 不依赖 status、statusText 或 response.body 是否可读——请求取消后,response 对象根本不会生成
实际代码中怎么写?
在 catch 块里做精准识别,避免把取消误当成真实错误处理:
fetch('/api/data', { signal })
.then(res => res.json())
.catch(err => {
if (err.name === 'AbortError') {
console.log('用户主动取消,无需上报');
return;
}
// 其他错误走正常流程
console.error('真实异常:', err);
});
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
立即学习“Java免费学习笔记(深入)”;
不能靠什么来判断?
以下方式不可靠,容易出错:
- 检查
err.message是否包含 “abort” 字样——不同浏览器文案不统一,且可能被覆盖 - 检查
signal.aborted——取消后 signal 确实会变成true,但它无法告诉你当前错误是不是由它引起的(比如多个请求共用一个 signal) - 试图读取
response或判断response.ok——取消时根本不会进入then,也就没有 response 可查
扩展:在自定义异步逻辑中也保持一致
如果你在封装轮询、定时任务等逻辑,并手动监听 signal.addEventListener('abort', ...),建议也主动抛出 new DOMException('Aborted', 'AbortError'),这样上层统一用 err.name === 'AbortError' 就能兼容所有场景。

















