为什么 .json() 是异步的?

use*_*063 8 javascript asynchronous promise async-await

我一直在关注教程并遇到以下代码片段:

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();
Run Code Online (Sandbox Code Playgroud)

是否应该立即将响应转换为 JSON 对象,就像从数组中获取值userJson[1]一样?为什么需要await usersResponse.json()posts.json()

jfr*_*d00 20

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

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

  • @Vaibhav - 整个主体被读入内存,然后被解析。回答这些问题的最佳方法是查看[源代码](https://github.com/expressjs/body-parser/blob/master/lib/types/json.js#L89)。 (2认同)