为何fetch使用AbortSignal.timeout()始终返回AbortError而非TimeoutError?
问题解答:fetch超时抛出AbortError而非TimeoutError的原因
问题复现代码
const getData = async function () { try { const response = await fetch(`${API_URL}/cars`, { signal: AbortSignal.timeout(5_000), }); console.log(response); } catch (err) { console.log(err.name); //AbortError console.dir(err); } }; getData();
问题现象
上述代码通过AbortSignal.timeout()为fetch请求设置超时逻辑,根据MDN文档定义:
- 超时触发时应抛出TimeoutError
- 浏览器内置停止操作(如点击停止按钮、关闭标签页)触发中止时,才会抛出AbortError
但实际测试中,无论采用何种超时场景(慢3G节流+100ms超时、服务器10秒响应+9000ms超时),始终只会捕获到AbortError(错误消息为"The user aborted a request."),从未出现预期的TimeoutError。
问题范围与现状
- 该问题仅出现在Chromium内核浏览器(如Google Chrome、Microsoft Edge)以及Safari浏览器中,Firefox浏览器的表现完全符合MDN文档描述。
- 目前该问题已在对应浏览器项目提交bug报告:
- Chromium项目
- Safari项目
内容的提问来源于stack exchange,提问作者Aayush Karna
相关产品推荐
相关产品推荐

