【发布时间】:2017-01-19 00:53:22
【问题描述】:
我刚刚开始学习 Fetch API:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
这是我写的代码 sn-p 来修补它:
fetch('http://swapi.co/api/people/1')
.then(function(response) {
var json = response.json();
console.log(json);
// Expected : { "name": "Luke Skywalker","height": "1.72 m", ... }
// Get : Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
});
我本来希望从 response.json() 中得到一个 JSON 对象。
类似于使用 JSON.parse() 时得到的结果。
相反,我得到了一个承诺对象。
如果我像这里所示放大承诺链......
return response.json().then(function(json) {
// process your JSON further
});
...然后它起作用了:在以下承诺的 then 方法中,它显示为 json。
为什么我无法在第一个 Promise 的 then() 中检索 JSON 数据?
谁能解释一下这里发生了什么?
非常感谢。
【问题讨论】:
-
大多数人没有提到的是,通过在获得标题后立即解析,您可以开始使用该信息进行操作。假设您收到了 400 和一堵巨大的文字墙(不知道为什么会这样),但您可以立即尝试备用呼叫或处理它,而不是浪费时间获取整个响应正文。
-
我不想因为提出这个答案而被否决...返回给您的对象。 (您将此命名为“响应”)它有一个尚未利用的数据流。可大可小,反正。如果可以选择读取它并返回一个 json 对象。或者您可以检查一些标头标签并完全拒绝该请求。在这里和现在结束请求就像抛出错误或返回一样简单。但是要继续使用该数据流,因为在这里使用 Promise 会带来更多好处。
标签: javascript json asynchronous