【发布时间】:2018-06-01 15:11:37
【问题描述】:
我从 JS 开始,实际上喜欢异步方面(来自 Python),但我不确定为什么有些函数会返回 Promise。具体来说,下面使用fetch的代码让我想知道json()返回了什么:
fetch('https://freegeoip.net/json/8.8.8.8')
.then((response) => {
return response.json()
})
.then((json) => {
Object.keys(json).forEach((key) => {
console.log("got " + key)
})
})
抛开流式传输不谈,我们在GET 之后得到的 HTTP 响应是一个文本块,随后客户端会对其进行解释以提取标题、正文和其他有趣的元素 - 作为 HTTP 内容分析的一部分。
重点是这段文字是一体的,所以第一个then()已经有了完整的响应——为什么解析JSON体是一个异步操作,和第二个@中的forEach不同987654327@?
换句话说,为什么我不能让下面的代码工作?
fetch('https://freegeoip.net/json/8.8.8.8')
.then((response) => {
Object.keys(response.json()).forEach((key) => {
console.log("got " + key)
})
})
注意:如果第一个代码运行不正确(使用ERR_BLOCKED_BY_CLIENT),请尝试禁用您的广告拦截器。第二个是故意不正确的。
【问题讨论】:
-
"我们在 GET 之后得到的 HTTP 响应是一个文本块" - 不。这是一个流。
-
@Bergi:在这种情况下,一切都是流(数据包、字节等)。
GET将一个已完成的文本块合并为一个片段(除了真正的流式传输,数据流不会结束)。同样,不能谈论“将文件读入内存”,因为它在技术上是流式传输。 -
流式传输的要点在于它可以带来多个文本块——例如,可以在正文尚未完成时已经处理标题。这正是这里发生的事情。
标签: javascript json promise fetch-api