当前位置: 首页 > 面试题库 >

为什么来自JavaScript fetch API的响应对象是一个承诺?

佴德曜
2023-03-14
问题内容

从具有JavaScript fetch API的服务器请求时,您必须执行以下操作

fetch(API)
  .then(response => response.json())
  .catch(err => console.log(err))

在这里,response.json()正在履行诺言。

事实是,如果您想捕捉404的错误,则必须解决响应承诺,然后拒绝获取承诺,因为只有在catch出现网络错误时才能结束。因此,提取调用就像

fetch(API)
  .then(response => response.ok ? response.json() : response.json().then(err => Promise.reject(err)))
  .catch(err => console.log(err))

这是很难理解的原因。所以我的问题是:为什么需要这样做?将诺言作为响应值有什么意义?有没有更好的方法来解决这个问题?


问题答案:

如果您的问题是“为什么要response.json()返还诺言?” 然后@Bergi在注释中提供线索:“它等待身体加载”。

如果您的问题是“为什么不是response.json属性?”,那么这将需要fetch延迟返回其响应,直到主体加载完毕,这对于某些人(但不是所有人)都可以。

这种polyfill应该可以为您提供所需的东西:

var fetchOk = api => fetch(api)
  .then(res => res.ok ? res : res.json().then(err => Promise.reject(err)));

那么您可以执行以下操作:

fetchOk(API)
  .then(response => response.json())
  .catch(err => console.log(err));

反向不能被填充。



 类似资料:
  • 当使用JavaScript读取API从服务器请求时,您必须执行以下操作 这里,

  • 这是我在班级游戏板。在这节课中,我尝试制作一个GameTree来返回这个棋盘上所有可能的下一步动作的列表。当这部分代码运行时,它会影响游戏板,因为它包含了这段代码,导致所有的移动实际上都是在游戏板上进行的,在游戏板上,我只是尝试用一个移动来返回板。下面是Gameboard中的代码: 我不明白为什么这不是简单地创建一个新的游戏板对象,播放有效的移动,并将其添加到列表。相反,在这个for循环结束时,游

  • 问题内容: 我相信Erlang社区不会羡慕Node.js,因为它本身就进行非阻塞I / O并具有将部署轻松扩展到一个以上处理器(Node.js甚至没有内置的功能)的方法。有关更多详细信息,请访问http://journal.dedasys.com/2010/04/29/erlang- vs-node-js 和Node.js或Erlang 那Haskell呢?Haskell是否可以提供Node.js

  • 问题内容: 我有一个嵌套的字典,我们称它为字典d。该词典的键是一个整数,每个键的值是另一个词典。我正在python 2.7上尝试一个简单的代码来更新一个外键的值,但似乎它正在更新外键的ALL的值。 希望这些代码将使其更易于理解。这是我的意见。 然后是输出: 您会看到,我只为d [0] [‘mean’]分配了‘1’,但是d [1] [‘mean’]也有所更新。如果我增加d键的数量,它将只更改所有d键

  • 我已经为我的自定义日志拦截器执行了以下操作 我正在将拦截器设置为restTemboard 记录器正在将响应正确地打印到控制台,但最后响应会以空的形式返回给调用者。我无法调试和解决它。 我已经弄明白了StreamUtils。copyToString(response.getBody(),字符集。defaultCharset())正在读取一次输入流,并且不再在其中保存响应正文(现在为空) 还有谁也面临

  • 本文向大家介绍为什么建议setState的第一个参数是callback而不是一个对象呢?相关面试题,主要包含被问及为什么建议setState的第一个参数是callback而不是一个对象呢?时的应答技巧和注意事项,需要的朋友参考一下 React 为了优化性能,有可能会将多个 setState() 调用合并为一次更新。 因为this.props和this.state 可能是异步更新的,你不能依赖他们的