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

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

我一直在胡闹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返回对象文字中的承诺,但返回值如果刚刚返回?



慕无忌1623718
浏览 247回答 3
3回答

qq_遁去的一_1

为什么response.json还承诺?因为你收到了response只要所有标题都到了。呼叫.json()获取尚未加载的HTTP响应主体的另一个承诺。另见为什么JavaScriptFETCH API中的响应对象是一个承诺?.如果我从then处理程序?因为承诺就是这样运作的..从回调中返回承诺并使其被采纳的能力是它们最相关的特性,它使它们无需嵌套就可以链接。你可以用fetch(url).then(response =>      response.json().then(data => ({         data: data,         status: response.status    })).then(res => {     console.log(res.status, res.data.title)}));或任何其他访问先前承诺的方法会导致.Then()链等待JSON身体后获得响应状态。

缥缈止盈

这种差异是由于承诺的行为,而非承诺。fetch()特别是。当.then()回调返回额外的Promise,下一个.then()链中的回调本质上是与该承诺绑定在一起的,它接受它的决心或拒绝它的实现和价值。第二个片段也可以编写为:iterator.then(response =>     response.json().then(post => document.write(post.title)));无论是这种形式还是你的,post返回的承诺所提供的response.json().当你回到平原Object不过,.then()认为一个成功的结果并立即解决,类似于:iterator.then(response =>     Promise.resolve({       data: response.json(),       status: response.status    })     .then(post => document.write(post.data)));post在本例中,只是Object您创建的,其中包含一个Promise在其data财产。等待这一承诺的实现仍然是不完整的。

明月笑刀无情

而且,帮助我理解您所描述的这个特定场景的是承诺API。文献资料,特别是在哪里,它解释了承诺是如何由then方法将根据处理程序FN返回:如果处理程序函数:返回一个值,然后以返回的值作为它的值来解析返回的承诺;抛出一个错误,然后返回的承诺以抛出的错误作为其值而被拒绝;返回一个已经解决的承诺,然后以该承诺的价值作为其价值来解决该承诺所返回的承诺;返回一个已经被拒绝的承诺,然后返回的承诺以该承诺的值作为其价值而被拒绝。返回另一个挂起的承诺对象,此时返回的承诺的解析/拒绝将在处理程序返回的承诺的解析/拒绝之后。此外,到那时返回的允诺的值将与处理程序返回的允诺的值相同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript