首页 > web前端 > js教程 > 为什么 Fetch 的 .json() 方法有时返回 Promise,有时返回值?

为什么 Fetch 的 .json() 方法有时返回 Promise,有时返回值?

Mary-Kate Olsen
发布: 2024-12-27 08:51:14
原创
661 人浏览过

Why Does Fetch's .json() Method Sometimes Return a Promise and Sometimes Return a Value?

探索 Fetch 的 .json() 方法中的 Promise 行为

在探索 Fetch API 时,.json() 方法出现了一个有趣的怪癖。让我们深入研究一下为什么它在某些情况下返回一个 Promise,而在其他情况下返回一个直接值。

考虑以下代码片段:

fetch(url)
  .then(response => {
      return {
          data: response.json(),
          status: response.status
      }
  })
  .then(post => document.write(post.data));
登录后复制

这里,post.data 生成一个 Promise 对象,这表明第一个 .then() 处理程序中的 .json() 调用返回一个承诺。

但是,如果我们修改代码以简单地链接.json():

fetch(url)
  .then(response => response.json())
  .then(post => document.write(post.title));
登录后复制

post 现在成为一个对象,允许直接访问 title 属性。

要解开这个谜团,我们必须了解 Promise 的本质。 .json() 启动一个异步操作,以 JSON 形式获取 HTTP 响应正文,并返回一个承诺。这个 Promise 代表 JSON 解析数据的最终可用性。

当 Promise 从 .then() 处理程序返回时(如第一个示例),Promise 继续存在于链中。但是,当返回一个值时(如第二个示例中所示),promise 被视为“已履行”,并且返回的值将被采用作为外部 .then() 的结果。

为了处理这种情况,您可以使用嵌套的 .then()s:

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

链接承诺,或者使用现代异步关键字,例如 async 和wait:

const response = await fetch(url);
const data = await response.json();
console.log(response.status, data.title);
登录后复制

请记住在尝试解析 JSON 之前始终检查 HTTP 响应状态,因为它可能并不总是采用预期的格式。

以上是为什么 Fetch 的 .json() 方法有时返回 Promise,有时返回值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板