为啥 .json() 是异步的? [复制]

Posted

技术标签:

【中文标题】为啥 .json() 是异步的? [复制]【英文标题】:Why is .json() asynchronous? [duplicate]为什么 .json() 是异步的? [复制] 【发布时间】:2020-04-20 15:47:11 【问题描述】:

我一直在关注一个教程,并遇到了以下代码 sn-p:

const myAsyncFunction = async () => 
    const usersResponse = await fetch(
        'https://jsonplaceholder.typicode.com/users'
    )
    const userJson = await usersResponse.json();
    const secondUser = userJson[1];
    console.log(secondUser);
    const posts = await fetch (
        'https://jsonplaceholder.typicode.com/posts?userId=' + secondUser.id
    );
    const postsJson = await posts.json();
    console.log(postsJson);

myAsyncFunction();

不应该立即将响应转换为 JSON 对象,就像从数组中获取值一样,例如userJson[1] 有吗?为什么需要awaitusersResponse.json()posts.json()

【问题讨论】:

因为读取和解析请求体不必阻塞。 好的,谢谢!那时我可能对 Promise 产生了错误的印象,因为我认为异步操作通常只与 http 请求/获取有关。但这是否也意味着本地 cpu 繁重的操作默认是异步的? @user3545063 不,这并不意味着本地 CPU 密集型操作将是异步的。那将是同步的。 .json() 是异步的,因为在调用 .json() 时可能尚未读取整个响应正文。查看the Response MDN page 上的方法描述并注意其中包括.json() 在内的一些方法说“接受一个响应流并读取它以完成”。 (强调) 【参考方案1】:

在最初的fetch() 调用之后,只读取了标题。因此,要将正文解析为 JSON,首先必须从传入流中读取正文数据。而且,由于从 TCP 流中读取是异步的,.json() 操作最终是异步的。

注意:JSON 本身的实际解析不是异步的。只是从传入流中异步检索数据。

【讨论】:

感谢@jfriend00 的解释。我有一个问题,.json() 是在正文数据到来时解析它还是等待整个数据到来然后解析它? @Vaibhav - 整个身体被读入内存,然后被解析。回答这些问题的最好方法就是看看the source。 感谢清理。

以上是关于为啥 .json() 是异步的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Body.json() 返回一个 Promise? [复制]

为啥斜线在 JSON 中是可转义字符? [复制]

加载时异步下载json文件:同时? [复制]

为啥我们需要使用 package.json? [复制]

为啥我的 json.Marshal() 啥也没返回? [复制]

为啥这个类不是 JSON 可序列化的? [复制]