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

时间:2014-01-25 13:06:39

标签: angularjs

我的问题是,鉴于拦截器的强大功能,将$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的myGetmyPost方法而不是$http的get,post方法。希望它有意义!

[编辑]我们肯定会使用的用例是截取添加标题,日志记录和日志记录,异常处理等响应的请求。但我确信这些可以由拦截器处理。后来从$ http移动到$ resource目前还不知道。

感谢。

2 个答案:

答案 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等...)。