不想在控制器中公开$ http

时间:2013-01-10 18:58:54

标签: javascript angularjs

在服务中处理$ http有related question,但我想稍微详细说明。我希望我的控制器能够使用类似于Angular $ http API的API执行服务调用:

$scope.login = function(user) {
  securityService.login(user).success(function(data) {
    $scope.data = data;
  }).error(function(data) {
    $scope.error = data;
  });
};

这是一个很好的可读API。从表面上看,我在服务API中需要做的就是:

return {
  name : 'User Service',
  login : function(user) {
    return $http.post("/api/login", user);
  }
};

很好,它会返回承诺,并会附带successerror条消息。但是......如果我想处理服务中的成功和失败案例怎么办?我想维护漂亮,可读的服务API。在这种情况下,也许我想保留用户,以便我可以公开像securityService.currentUser()或`securityService.isLoggedIn()'这样的方法。

我尝试了$http.post().then(...) promise API,但那些会返回整个HTTP响应。同样,我想将HTTP与服务隔离开来,并维护一个类似的具体回调API。

2 个答案:

答案 0 :(得分:5)

你可以使用angular login

$q中做出自己的承诺
var deferred = $q.defer(), 
    promise = deferred.promise;

$http.post("/api/login", user).success(...).error(...)

return promise;

在服务中$ http承诺的成功/失败中,解析/拒绝您的延迟对象。

修改

扩展$http.post

$http.post("/api/login", user).success(function(data) {
  if (data == "foo") { // success case?
    deferred.resolve('you logged in!');
  } else {
    deferred.reject('something really bad happened!');
  }
})

答案 1 :(得分:1)

我刚刚运行了一个测试用例,如果我从服务API返回这样的承诺:

return $http.post("/api/login", user).success(...).error(...)

我也可以在控制器中做同样的事情:

service.login(user).success(...).error(...)

并且两者都被调用,服务优先,控制器第二。那太棒了!