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

为什么Body.json()返回Promise?[重复]

公羊瀚
2023-03-14

我从JS开始,实际上喜欢异步方面(来自Python),但我不确定为什么有些函数返回Promise。具体来说,下面使用getch的代码让我想知道json()返回了什么:

fetch('https://freegeoip.net/json/8.8.8.8')
  .then((response) => {
    return response.json()
  })
  .then((json) => {
    Object.keys(json).forEach((key) => {
      console.log("got " + key)
    })
  })

除了流之外,我们在get之后得到的HTTP响应是一个文本块,客户端稍后会对其进行解释,以提取标题、正文和其他有趣的元素,作为HTTP内容分析的一部分。

关键是这个文本块是一块的,所以第一个然后是()已经有了整个响应——为什么JSON主体的解析是异步操作,不同于第二个中的foreach>然后()

换句话说,为什么我不能让下面的代码工作?

fetch('https://freegeoip.net/json/8.8.8.8')
  .then((response) => {
    Object.keys(response.json()).forEach((key) => {
      console.log("got " + key)
    })
  })

注意:如果第一个代码没有正确运行,请尝试禁用您的adblocker(使用ERR\u-BLOCKED\u-BY\u-CLIENT)。第二个是故意不正确的。

共有2个答案

程项禹
2023-03-14

你说得对——两个片段都做同样的事情。在第一段,以下部分:

.then((response) => {
  return response.json()
})

只是在第一步中处理响应并传递结果。这个简单的案例不需要将其分为两个步骤,所以您可以轻松地使用第二个示例。

在某些情况下,它可能很有用。

伯逸明
2023-03-14

您的第二个代码段不起作用,因为响应。json()akabody。json()不会立即解析。

这是因为正文。JSON()使用Promise异步返回响应;然后必须由然后()回调捕获,以便读取/操作。

这就是Promises的本质。

然而,这种语法流仍然可以通过利用asyncawait来实现。

fetch('https://freegeoip.net/json/8.8.8.8')
.then(async (response) => {
  Object.keys(await response.json()).forEach((key) => {
    console.log("got " + key)
  })
})
 类似资料:
  • 我最近一直在摆弄api,并注意到一些有点古怪的东西。 返回一个对象。http://jsbin.com/wofulo/2/edit?js输出 但是,如果写为: 这里是一个标准的,您可以访问title属性 所以我的问题是:为什么在对象文本中返回一个promise,但是如果刚刚返回,则返回值?

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 如何从PHP的MySql响应中“回显”“资源ID#6”? 我是php和SQL的新手,我正在尝试使php页面列出表中的枚举数。我正在使用此代码,但它返回资源ID#2: 问题答案: 因为执行时会获得mysql资源。 使用类似的方法来获取下一行。它返回一个以列名作为索引的数组。就您而言,可能是。 这是您的代码段的修复程序和一些小改进:

  • 我正在尝试使用废料并遇到一些问题。问题是我的脚本返回重复的结果。我正在尝试从父页面抓取URL,并按照每个单独的URL获取关联的日期。抓取每个嵌套的URL后,它似乎会再次从父页面输出URL列表。 下面是脚本: 下面是 json 输出: 重申一下,我很难从父页面输出一个url列表,从每个单独的嵌套URL输出一个相应的日期列表。我是scrapy和python的新手,所以希望有人能给我指出正确的方向。

  • 如果用非空数组调用promise.all或promise.race,它们将返回一个挂起的promise: 为什么promise。所有功能都是这样设计的?似乎没有很好的理由不一致,但也许我错过了什么。

  • 可能的重复: 在JavaScript中Deferred、Promise和Future之间有什么区别? 有人能指出回调和promise之间有什么不同吗?什么时候应该使用promise等? 此外,关于如何创建和使用promise的链接将得到赞赏。

  • line.FlatMap(WordSutil::GetWords)是方法引用中错误的返回类型: 编码方法: