【问题标题】: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() 在内的一些方法说“接受一个响应流并读取它以完成”。 (强调)

标签: javascript asynchronous promise async-await


【解决方案1】:

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

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

【讨论】:

  • 感谢@jfriend00 的解释。我有一个问题,.json() 是在正文数据到来时解析它还是等待整个数据到来然后解析它?
  • @Vaibhav - 整个身体被读入内存,然后被解析。回答这些问题的最好方法就是看看the source
  • 感谢清理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多