我的问题是,鉴于拦截器的强大功能,将$http
包装在一个服务中是有意义的,这样我的所有其他代码才会调用该包装器。现在拦截器可以很容易地完成标头/异常处理等基本任务。虽然我现在无法想到一个有效的用例,但是我们只是为了保护未来的api更改等$http
?或者可能以后迁移到$ resource?
另请注意,这里我讨论的是基于$http
方法的基本包装器服务,而不是像DataService这样的客户端服务,方法是sendData,receiveData包含$http
个调用。
请在下面找到示例代码 -
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方法。希望它有意义!
[编辑]我们肯定会使用的用例是截取添加标题,日志记录和日志记录,异常处理等响应的请求。但我确信这些可以由拦截器处理。后来从$ http移动到$ resource目前还不知道。
感谢。
答案 0 :(得分:15)
对于您描述的具体案例,我建议不要包裹$http
。这样做并没有真正的好处。
这可以发挥作用的情况是你想要更多的说话' API。假设您在系统中有User
(s),Address
(es)。您将其描述为基于数据的服务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;
}
}
}]);
这允许您使用呼叫参数。每当你不得不改变路线时,你只有一个地方可以改变它们(如果你有十几个控制器发出$http
请求,这将是非常糟糕的)。
如果你在哪里(并且你实际上有兼容的资源),你也可以在这里使用$resource
。这里的决策因素应该是可读性,可重用性和以后易于更改。
所以,如果你只是在那里进行这些调用并且路由永远不会改变,请继续直接使用$http
,而不使用包装器。我认为这在不断增长的应用中是不可能的。
答案 1 :(得分:1)
我需要我的'得到'如此广泛如此:
app.factory('myHttp', ['$http', '$q', function($http, $q) {
return {
get: function(url) {
var deferred = $q.defer();
$http.get(url).then(
function(response) {
//console.log("response good");
deferred.resolve(response)
},
function(response) {
//console.log("response bad");
deferred.reject(response)
})
return deferred.promise;
}
};
}]);
您现在可以链接一个额外的"然后"得到的结果。您可以使用核心逻辑来处理错误或成功(我的用例是在凭据过期时注销用户)但仍允许获取响应的其他上下文特定逻辑(如设置$ scope等...)。