一尘不染

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

javascript

从具有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))

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


阅读 311

收藏
2020-05-01

共1个答案

一尘不染

如果您的问题是“为什么要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));

反向不能被填充。

2020-05-01