当前位置: 首页 > 知识库问答 >
问题:

为什么呢。json()是否返回promise?

傅越
2023-03-14

我最近一直在摆弄getch()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。数据返回一个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属性

所以我的问题是:为什么response.json在对象文本中返回一个promise,但是如果刚刚返回,则返回值?

共有3个答案

颛孙越
2023-03-14

另外,帮助我理解您描述的这个特定场景的是Promise API文档,特别是其中解释了如何根据处理程序fn返回的内容,以不同方式解析then方法返回的promised:

如果处理程序函数:

  • 返回一个值,然后返回的promise将以返回的值作为其值进行解析;
  • 抛出一个错误,然后返回的promise被拒绝,抛出的错误作为其值;
  • 返回一个已解析的promise,然后返回的promise将以该promise的值作为其值进行解析;
  • 返回一个已经被拒绝的promise,然后返回的promise被拒绝,该promise的值作为其值。
  • 返回另一个挂起的promise对象,然后返回的promise的解决/拒绝将在处理程序返回的promise的解决/拒绝之后。此外,此时返回的promise值将与处理程序返回的promise值相同。
怀齐智
2023-03-14

这种差异是由于promise的行为造成的,而不是具体的fetch()

当回调返回一个额外的Promise时,链中的下一个回调基本上绑定到该Promise,接收其解决或拒绝实现和值。

第二段也可以写成:

iterator.then(response =>
    response.json().then(post => document.write(post.title))
);

在这个表单和你的表单中,post的值由从response.json()返回的Promise提供。

但是,当返回一个普通的Object时,. so()认为结果是成功的,并立即自行解决,类似于:

iterator.then(response =>
    Promise.resolve({
      data: response.json(),
      status: response.status
    })
    .then(post => document.write(post.data))
);

在本例中,post只是您创建的对象,它在其数据属性中持有Promise。等待这一promise实现的过程仍然是不完整的。

沈英勋
2023-03-14

为什么response.json返回一个promise?

因为一旦所有标头到达,您就会收到响应。调用. json()将为尚未加载的超文本传输协议响应体获取另一个promise。另请参阅为什么来自JavaScript获取API的响应对象是一个promise?。

如果我从then处理程序返回promise,为什么要获取该值?

因为promise就是这样。从回调返回promise并让它们被采纳的能力是它们最相关的特性,它使它们无需嵌套即可链接。

你可以用

fetch(url).then(response => 
    response.json().then(data => ({
        data: data,
        status: response.status
    })
).then(res => {
    console.log(res.status, res.data.title)
}));

或者任何其他访问先前promise的方法都会在等待json主体后产生一个. so()链来获取响应状态。

 类似资料:
  • 问题内容: 我尝试在两种情况下执行T-SQL查询(我使用Win7,python 3.2,MS SQL Server Express 2008,适用于python 3.2的pyodbc): -情况1: 使用MS SQL Server Management Studio,我尝试执行查询: 返回成功结果 情况2: 但是运行代码后,我收到错误消息 如果我没有运行代码 我没有收到任何错误。但为什么? 问题答

  • 在Go语言中有flag.String()函数,请问下: 1、flag.String()返回的是什么呢? 为何需要这样来返回? 2、countryCodeFile 不是一个字符串吗?

  • 问题内容: 我最近一直在搞弄api,发现有些奇怪的地方。 返回一个对象。输出 但是,如果将其写为: 这是您可以访问标题属性的标准。 所以我的问题是:为什么要在对象文字中返回一个promise,但是如果刚返回则返回一个值? 问题答案: 为什么要兑现承诺? 因为您在所有标头到达后立即收到。调用使您对尚未加载的http响应的正文有了另一个保证。另请参见[为什么来自JavaScriptfetch API的

  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果:

  • 问题内容: 据我所知,使用或实例化对象分别返回或的新实例。具有 新标识 的新实例对象。 在我实际测试它之前,这对我来说是很清楚的,我注意到它实际上返回了而不是预期的: 如预期的那样,分别使用和创建对象时,也会表现出这种行为: 我可以在状态文档中找到唯一相关的信息: […]例如,return和return 。 如果未提供任何参数,则构造函数将创建一个新的空元组。 可以说,这不足以回答我的问题。 那么

  • 本文向大家介绍Math.min() < Math.max() 返回结果是什么?为什么?相关面试题,主要包含被问及Math.min() < Math.max() 返回结果是什么?为什么?时的应答技巧和注意事项,需要的朋友参考一下 返回,因为返回,返回。 猜测的实现方式大致如下: 接受不定项参数,当参数只有一个的时候,例如,那么这个需要和(js中最小的数)进行比较,所以结果返回,哪怕传入的值再小,单个