为啥 .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]
有吗?为什么需要await
usersResponse.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? [复制]