2

有关于在服务中处理 $http 的相关问题,但我想稍微详细说明一下。我希望我的控制器能够使用类似于 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);
  }
};

太好了,它返回了承诺,success并且error伴随着消息而来。但是......如果我想处理服务中的成功和失败案例怎么办?我想维护漂亮、可读的服务 API。在这种情况下,也许我想保留用户,以便我可以公开诸如securityService.currentUser()“securityService.isLoggedIn()”之类的方法。

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

4

2 回答 2

5

login您可以在使用 angular's时做出自己的承诺$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!');
  }
})
于 2013-01-10T19:07:27.383 回答
1

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

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

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

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

并且都被调用,首先是服务,其次是控制器。那很完美!

于 2013-01-10T19:15:42.203 回答