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
相关产品推荐
相关产品推荐

