You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

fetch通过AbortSignal取消时,请求完成后执行res.json()也会被终止吗?

AbortSignal 取消请求后对响应解析的行为验证

我们都知道可以将AbortSignal传入fetch的配置项,用于取消正在进行的fetch请求,基础用法如下:

const res = await fetch('/endpoint', { signal });
const data = await res.json();

如果信号在网络请求本身已经完成、但返回数据还没完成解析时被取消,会出现什么情况?对应代码场景如下:

const res = await fetch('/endpoint', { signal });
// 此处调用abort触发信号取消
const data = await res.json();

针对这个场景的测试结果显示,在Firefox、Chrome和Safari三大主流浏览器中,res.json()都会被正确取消并抛出异常,但这种表现是否属于官方标准定义的行为?

测试用代码如下:

const log = (...text) => document.body.insertAdjacentHTML('beforeend', `${text.join(' ')}<br />`);

(async () => {
  try {
    const controller = new AbortController();
    const signal = controller.signal;

    const res = await fetch('https://swapi.dev/api/films/2/', { signal });
    log('Request:', signal.aborted);
    controller.abort();
    log('Before:', signal.aborted);
    const data = await res.json();
    log('After:', signal.aborted);
  } catch (error) {
    log('Cancelled:', error.name);
  }
})();

运行输出结果:

Request: false
Before: true
Cancelled: AbortError

从输出结果可以看出,res.json()执行时会正确抛出异常,代码不会执行到输出After的步骤,抛出的错误类型为AbortError。

内容的提问来源于stack exchange,提问作者Francisco Presencia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:36:04