将获取包装在promise中有什么好处?

时间:2019-05-27 00:58:08

标签: javascript promise fetch-api

我看到人们在承诺中包装了fetch方法。我似乎无法理解这样做的好处?提取本身会返回一个承诺,您可以从中提取所需内容。

let url = 'https://jsonplaceholder.typicode.com/users';

fetch(url)
 .then(function(response){
   //console.log(response.json());
   return response.json();

 })

 .then(function(data){
   console.log(JSON.stringify(data));
 })

 .catch(function(err){
 //console.log(err);
 err = 'this is an error';
 console.log(err);
 })

与此相比

return new Promise((resolve, reject) => {
  fetch(url)
  .then(res => res.json())
  .then(data => resolve(data))
  .catch(err => reject(err));
});

2 个答案:

答案 0 :(得分:1)

  

“无论响应是否成功,它都会返回一个Promise,该Promise会解析为对该请求的响应。”

Source

没有意义。人们只是在做一些事情,而他们可能习惯于使用诸如jQuery Deferreds之类的东西,这些东西没有适当的A + Promise实现。如果您愿意的话,如果您使用的是Bluebird之类的产品,可以这样做,但它或多或少毫无意义。

答案 1 :(得分:1)

实际上有一点。我将给您提供三个示例,其中这些场景非常有用。

  1. 可以说我们在许多地方都在调用距离休息api。也许一百页甚至更多。现在,我们需要在发送的每个请求中插入自定义标头。嗯...如果我们有很多地方调用过包装器,然后从包装器中取出一个包装器,那么我们只需在包装器中添加新的标头,所有调用都将包含新的标头。

  2. 我们重构了代码,现在我们有了新的闪亮的包装器来获取。我们插入了自定义标头,一切正常。但是经过一段时间后,我们发现可以说axios比使用fetch更好。幸运的是(ha!)我们包装了fetch,现在只有一个重构的地方。如果我们不这样做,我们将需要遍历混乱甚至更多的地方来进行更改...。现在,我们甚至有可能不仅仅进行更改,而且还可以实施“策略模式”之类的东西,在这里我们可以使用一个或多个另一个(fetch或axios),我们可以动态切换。

  3. 因为我们包装了这些实现,所以我们控制了我们在代码中进一步使用的接口。如果某些包装的第三库发生更改,例如。它的属性名称我们将仅在包装器中对其进行修复。应用程序的其余部分使用的接口保持不变。

快速回顾一下,当您包装它时,现在只有一个地方可以更改,如果出现需要更改的地方,那么将来您可以切换多个实现。这是一个好习惯,尤其是在与第三方库一起使用时,将它们包装或制成适配器。

希望这会有所帮助。