为什么要将我的$ http调用转换为服务?
目前我有三个控制器都有这样的电话:
$scope.getCurrentUser = function () {
$http.post("/Account/CurrentUser", {}, postOptions)
.then(function(data) {
var result = angular.fromJson(data.data);
if (result != null) {
$scope.currentUser = result.id;
}
},
function(data) {
alert("Browser failed to get current user.");
});
};
我看到很多建议把$http
调用封装到一个HttpService中,或者其他一些方法,但是返回promise比返回数据更好。 然而,如果我回复承诺,我的控制器$http
所有行都会改变,并且处理响应的所有逻辑都保留在我的控制器中,例如:
$scope.getCurrentUser = function() {
RestService.post("/Account/CurrentUser", {}, postOptions)
.then(function(data) {
var result = angular.fromJson(data.data);
if (result != null) {
$scope.currentUser = result.id;
}
},
function(data) {
alert("Browser failed to get current user.");
});
};
我可以为每个服务器端控制器创建RestService,但最终只会调用核心服务并传递URL。
在非平凡的应用程序中,这是良好实践的几个原因。
使用单个通用服务并传递url和参数并不会增加您注意到的那么多的价值。 相反,您需要为每种类型的提取获取一种方法。
使用服务的一些好处:
一个控制器执行表示逻辑(它在Angular Model-View-Whatever模式中充当一个视图模型)。 服务做商业逻辑(模型)。 这是经过战斗证明的问题与OOP良好做法固有部分的分离。
瘦控制器和胖服务保证应用程序单位保持可重用,可测试和可维护。
如果它们是相同的东西,用RestService
替换$http
没有任何好处。 业务和表示逻辑的正确分离预计会是这样的
$scope.getCurrentUser = function() {
return UserService.getCurrent()
.then(function(user) {
$scope.currentUser = user.id;
})
.catch(function(err) {
alert("Browser failed to get current user.");
throw err;
});
});
它负责结果调节并返回一个承诺。 getCurrentUser
传递一个promise,所以它可以被链接(如果需要)(通过其他控制器方法或测试)。
让你的服务看起来像这样是有道理的:
app.factory('AccountService', function($http) {
return {
getCurrentUser: function(param1, param2) {
var postOptions = {}; // build the postOptions based on params here
return $http.post("/Account/CurrentUser", {}, postOptions)
.then(function(response) {
// do some common processing here
});
}
};
});
然后调用这个方法看起来就是这样的:
$scope.getCurrentUser = function() {
AccountService.getCurrentUser(param1, param2)
.then(function(currentUser){
// do your stuff here
});
};
这看起来好多了,并且可以避免在多个控制器中重复使用后端服务url和postOptions
变量构造。
上一篇: Why move my $http calls into a service?
下一篇: Get Data APDU command different tags and response format