V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
TWorldIsNButThis
V2EX  ›  问与答

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

  •  
  •   TWorldIsNButThis · 112 天前 via iPhone · 700 次点击
    这是一个创建于 112 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http 的响应和请求不是一段文本的字符串吗
    之前的 xhr http request 是同步的吗
    5 条回复    2022-04-24 08:43:25 +08:00
    autoxbc
        2
    autoxbc  
       112 天前
    等待另一个 CPU 内核上的计算密集任务完成,和等待网络 I/O 上数据的传输,本质上是一样的,都应该抽象成异步 API ,以便主线程可以无阻塞运行

    响应数据处理显然是个时间不可控的任务,类似的,JS 里的加解密 API 也是异步的
    lihongming
        3
    lihongming  
       112 天前   ❤️ 1
    @autoxbc 这个还真不是计算任务,看我发的链接。就是网络 I/O 导致的,response 在 header 加载完成后就返回了,那会儿还没下载 body 呢。
    moen
        4
    moen  
       112 天前   ❤️ 1
    这种 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
        5
    micean  
       112 天前
    java 的 vertx 框架的 httpClient 是先(request)connect 再 write body
    或许 fetch api 是一样的原因?
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2429 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 07:31 · PVG 15:31 · LAX 00:31 · JFK 03:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.