小编典典

为什么 .json() 返回一个承诺?

all

我最近一直在搞乱fetch()api,并注意到一些有点古怪的东西。

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,输出

但是,如果它写成:

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,输出

所以我的问题是:为什么response.json在对象字面量中返回一个承诺,但如果刚刚返回则返回值?


阅读 86

收藏
2022-07-13

共1个答案

小编典典

为什么要response.json返回一个承诺?

因为您会在response所有标题到达后立即收到。调用.json()会为您提供尚未加载的 http 响应正文的另一个承诺。另请参阅为什么来自
JavaScript fetch API
的响应对象是一个承诺?
.

如果我从处理程序返回承诺,为什么我会得到价值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 主体后获取响应状态。

2022-07-13