我最近一直在搞乱fetch()api,并注意到一些有点古怪的东西。
fetch()
let url = "http://jsonplaceholder.typicode.com/posts/6"; let iterator = fetch(url); iterator .then(response => { return { data: response.json(), status: response.status } }) .then(post => document.write(post.data)); ;
post.data返回一个Promise对象。 http://jsbin.com/wofulo/2/edit?js,输出
post.data
Promise
但是,如果它写成:
let url = "http://jsonplaceholder.typicode.com/posts/6"; let iterator = fetch(url); iterator .then(response => response.json()) .then(post => document.write(post.title)); ;
post这是一个Object可以访问 title 属性的标准。 http://jsbin.com/wofulo/edit?js,输出
post
Object
所以我的问题是:为什么response.json在对象字面量中返回一个承诺,但如果刚刚返回则返回值?
response.json
为什么要response.json返回一个承诺?
因为您会在response所有标题到达后立即收到。调用.json()会为您提供尚未加载的 http 响应正文的另一个承诺。另请参阅为什么来自 JavaScript fetch API 的响应对象是一个承诺?.
response
.json()
如果我从处理程序返回承诺,为什么我会得到价值then?
then
因为这就是 promise 的工作方式。从回调中返回 Promise 并让它们被采用的能力是它们最相关的特性,它使它们无需嵌套即可链接。
您可以使用
fetch(url).then(response => response.json().then(data => ({ data: data, status: response.status }) ).then(res => { console.log(res.status, res.data.title) }));
或任何其他访问先前承诺的方法都会导致 .then() 链在等待 json 主体后获取响应状态。