为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕无忌1623718 2019-10-20 13:08:33
为什么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返回对象文字中的承诺,但返回值如果刚刚返回?
查看完整描述

3 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

为什么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身体后获得响应状态。



查看完整回答
反对 回复 2019-10-21
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

这种差异是由于承诺的行为,而非承诺。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财产。等待这一承诺的实现仍然是不完整的。



查看完整回答
反对 回复 2019-10-21
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

而且,帮助我理解您所描述的这个特定场景的是承诺API。文献资料,特别是在哪里,它解释了承诺是如何由then方法将根据处理程序FN返回:

如果处理程序函数:

  • 返回一个值,然后以返回的值作为它的值来解析返回的承诺;
  • 抛出一个错误,然后返回的承诺以抛出的错误作为其值而被拒绝;
  • 返回一个已经解决的承诺,然后以该承诺的价值作为其价值来解决该承诺所返回的承诺;

  • 返回一个已经被拒绝的承诺,然后返回的承诺以该承诺的值作为其价值而被拒绝。
  • 返回另一个挂起的承诺对象,此时返回的承诺的解析/拒绝将在处理程序返回的承诺的解析/拒绝之后。此外,到那时返回的允诺的值将与处理程序返回的允诺的值相同。



查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 246 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信