我看到人们在承诺中包装了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));
});
答案 0 :(得分:1)
“无论响应是否成功,它都会返回一个Promise,该Promise会解析为对该请求的响应。”
没有意义。人们只是在做一些事情,而他们可能习惯于使用诸如jQuery Deferreds之类的东西,这些东西没有适当的A + Promise实现。如果您愿意的话,如果您使用的是Bluebird之类的产品,可以这样做,但它或多或少毫无意义。
答案 1 :(得分:1)
实际上有一点。我将给您提供三个示例,其中这些场景非常有用。
可以说我们在许多地方都在调用距离休息api。也许一百页甚至更多。现在,我们需要在发送的每个请求中插入自定义标头。嗯...如果我们有很多地方调用过包装器,然后从包装器中取出一个包装器,那么我们只需在包装器中添加新的标头,所有调用都将包含新的标头。
我们重构了代码,现在我们有了新的闪亮的包装器来获取。我们插入了自定义标头,一切正常。但是经过一段时间后,我们发现可以说axios比使用fetch更好。幸运的是(ha!)我们包装了fetch,现在只有一个重构的地方。如果我们不这样做,我们将需要遍历混乱甚至更多的地方来进行更改...。现在,我们甚至有可能不仅仅进行更改,而且还可以实施“策略模式”之类的东西,在这里我们可以使用一个或多个另一个(fetch或axios),我们可以动态切换。
因为我们包装了这些实现,所以我们控制了我们在代码中进一步使用的接口。如果某些包装的第三库发生更改,例如。它的属性名称我们将仅在包装器中对其进行修复。应用程序的其余部分使用的接口保持不变。
快速回顾一下,当您包装它时,现在只有一个地方可以更改,如果出现需要更改的地方,那么将来您可以切换多个实现。这是一个好习惯,尤其是在与第三方库一起使用时,将它们包装或制成适配器。
希望这会有所帮助。