为什么使用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() .
有一个简单的节点服务器来演示这一点。相关代码都在这里
YouTube视频演示在这
http://www.youtube.com/watch?v=Ki6…
作者:龙阡
来源:juejin.cn/post/7432269413405769762
来源:juejin.cn/post/7432269413405769762