通过 AbortController 中止获取请求后会发生什么?

Dum*_*mmy 7 javascript http fetch async-await web

如果fetch浏览器运行时中的请求通过 的信号中止AbortController,之后会发生什么?

进一步来说:

HTTP 请求将如何终止?如果HTTP请求/响应体还没有完全发送/接收,发送/接收是否会继续完成?

底层的TCP连接会被终止吗?如果是这样,它是通过典型的四次握手过程终止还是直接重置?fetch如果是这样,考虑到建立新的 TCP 连接可能需要很长时间,特别是当一堆请求被连续取消(例如搜索框的自动完成)时,是否仍然值得鼓励使用 AbortController ?

如果底层 TCP 连接将像往常一样重新使用,那么如何从不完整的 HTTP 请求中恢复它呢?(HTTP/2 或 QUIC 有什么新奇的魔力吗?)

(我试图在互联网、MDN 和定义 的DOM 标准AbortController上进行搜索,但没有发现任何内容提及中止在幕后是如何工作的。而且这些浏览器的代码库对我来说太晦涩难懂,甚至无法找到实现的位置。 )

小智 1

我也有同样的疑问,我询问了fetchNode.js官方实现的维护者。这就是它的工作原理:

  • 除了关闭 TCP 连接之外,HTTP 1.1 标准没有提供一种方法来表示“你知道吗,你可以丢弃该响应”。

  • 中止请求意味着我们必须停止下载并向服务器表明我们可以接受没有得到响应的情况。由于除了在 TCP 级别关闭之外没有其他方法,Undici 在响应主体被销毁后立即执行此操作。

  • 因此,即使您不想使用响应,也可能值得使用它,特别是在主体尺寸不太高的情况下。