注册
web

为什么使用fetch时,有两个await?

为什么使用fetch时,有两个await?


提问


// first await
let response = await fetch("/some-url")
// second await
let myObject = await response.json()

你以前在使用fetch时,见过这两个await对吗?


有没有思考过,这是为什么?


思考


我们在浏览器中使用异步编程来,处理需要时间才能完成的任务(也就是异步任务),这样我们就不会阻塞用户界面。


等待 fetch 是有道理的。因为我们最好不要阻止 UI!


但是,我们到底为什么需要呢 await response.json()


解析 JSON 应该不会花费很长时间。 事实上,我们经常调用 JSON.parse("{"key": "value"}") ,这是一个同步调用。 那么,为什么 response.json() 返回 promise 而不是我们真正想要的呢?


这是怎么回事?


摘自 MDN 关于 Fetch API 的文章


https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API#concepts_and_usage


fetch() 方法接受一个强制性参数,即你想要获取的资源的路径。 它返回一个 Promise,该 Promise 解析为该请求的 Response — 只要服务器使用 Headers 响应 — 即使服务器响应是 HTTP 错误状态。



因此,fetch 会在必须完全接收 body 之前解析响应。


查看前面的代码:


let response = await fetch("/some-url")

// At this point,
// 1. the client has received the headers
// 2. the body is (probably) still making its way over.

let myObject = await response.json()

// At this point,
// 1. the client has received the body
// 2. the client has tried to parse the body
// as json with the goal of making a JavaScript object

很明显,在整个正文到达之前访问 headers 是多么有用。


根据状态代码或其中一个标头,我们可能会决定根本不读取正文。


而 body 在 headers 之后到达实际上是我们已经习惯的。这就是浏览器中一切的工作方式。


HTML 通过网络缓慢发送,图像、字体等也是如此。


我想我只是被方法的名称弄糊涂了: response.json() .


有一个简单的节点服务器来演示这一点。相关代码都在这里


github.com/tom-on-the-…


YouTube视频演示在这


http://www.youtube.com/watch?v=Ki6…


原文地址 tomontheinternet.com/why-two-awa…


作者:龙阡
来源:juejin.cn/post/7432269413405769762

0 个评论

要回复文章请先登录注册