为什么 fetch api 的 body 操作如 text json 是异步的

2022-04-24 02:07:44 +08:00
 TWorldIsNButThis
http 的响应和请求不是一段文本的字符串吗
之前的 xhr http request 是同步的吗
1162 次点击
所在节点    问与答
5 条回复
lihongming
2022-04-24 02:34:42 +08:00
autoxbc
2022-04-24 02:38:17 +08:00
等待另一个 CPU 内核上的计算密集任务完成,和等待网络 I/O 上数据的传输,本质上是一样的,都应该抽象成异步 API ,以便主线程可以无阻塞运行

响应数据处理显然是个时间不可控的任务,类似的,JS 里的加解密 API 也是异步的
lihongming
2022-04-24 02:51:08 +08:00
@autoxbc 这个还真不是计算任务,看我发的链接。就是网络 I/O 导致的,response 在 header 加载完成后就返回了,那会儿还没下载 body 呢。
moen
2022-04-24 03:31:19 +08:00
这种 body 分离的设计是合理的,有一些需求不能按 OP 的想法直接一个 fetch 就返回整个 response

首先有的需求只需要获取 HTTP header ,不关心 body 是什么,那么浏览器只需要把 header 读取完即可返回,减少不必要的网络请求
其次是解析一个可能无限长的 body ,既一个很长时间才会出现(或者根本就不存在)「 0\r\n\r\n 」的 chunked transfer encoded body 。这种情况下除非出错,基本上很难等到 await 结束,而且可能在此之前内存就已经消耗殆尽。显然合理的做法是先读取完 header 返回然后让开发者调用 body 或者 arrayBuffer() 做流解析

像 .Net 的 HttpClient 也有这种设计,可以通过设定 HttpCompletionOption.ResponseHeadersRead 先读取完 Header 返回 HttpResponseMessage 再通过 Content 获取剩下的部分
micean
2022-04-24 08:43:25 +08:00
java 的 vertx 框架的 httpClient 是先(request)connect 再 write body
或许 fetch api 是一样的原因?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/848848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX