gpt4 book ai didi

AngularJS - 我们应该将 $http 方法包装在服务中吗

转载 作者:行者123 更新时间:2023-12-02 21:46:22 24 4
gpt4 key购买 nike

我的问题是,鉴于拦截器的强大功能,将 $http 包装起来是否有意义?在服务中,以便我的所有其他代码只调用该包装器。现在,诸如 header /异常处理之类的基本任务可以通过拦截器轻松完成。因此,虽然我现在想不出一个有效的用例,但可以说只是为了屏蔽任何 future 的 api 更改等到 $http ?或者也许稍后迁移到 $resource?

另请注意,这里我谈论的是 $http 周围的基本包装服务。的方法,而不是像 DataService 这样的客户端服务,其方法包含 $http 的 sendData、receiveData来电。请找到下面的示例代码 -

angular.module(‘myapp’).factory(‘myhttpwrapper’, ['$http', function (http) {
return {

myGet: function (getUrl) {
return http.get(getUrl);
},
myPost: function (postUrl, data) {
return http.post(postUrl, data);
},
// other $http wrappers
};
}]);

现在所有其他代码都将使用 myhttpwrapper 的 myGet , myPost方法而不是 $http的 get、post 方法。希望这是有道理的!

[编辑] 我们肯定会遇到的用例是拦截添加 header 、日志记录以及日志响应、异常处理等的请求。但我确信这些可以由拦截器处理。稍后从 $http 转移到 $resource 目前尚不清楚。

谢谢。

最佳答案

对于您描述的具体情况,我建议不要包装$http。这样做并没有真正的收获。

这种情况可能会发挥作用,那就是您需要一个更加“会说话”的 API。假设您的系统中有用户地址。您将其描述为基于数据的服务DataService:

var app = angular.module("users", []);

app.service("User", ['$http', '$q', function(http, q) {
return {
getAddress: function(user) {
var address = q.defer();
http.get("/user/" + user.id + "/address").then(function(data) {
address.resolve(data);
}, function(err) {
address.reject(err);
});
return address.promise;
},
getUser: function() {
var user = = q.defer();
http.get("/user/address").then(function(data) {
user.resolve(data);
}, function(err) {
user.reject(err);
});
return user.promise;
}
}
}]);

这允许您在调用中使用参数。每当您必须更改路由时,您只有一个地方可以更改它们(如果您有十几个 Controller 发出 $http 请求,这将非常糟糕)。

如果您愿意(并且您实际上拥有兼容的资源),您还可以在此处使用$resource。这里的决策因素应该是可读性可重用性以后易于更改

因此,如果您只在进行这些调用的地方并且路由永远不会改变,请继续直接使用 $http,而不需要包装器。我认为这在不断增长的应用程序中不太可能。

关于AngularJS - 我们应该将 $http 方法包装在服务中吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21350936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com