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

use*_*682 12 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
  };
}]);
Run Code Online (Sandbox Code Playgroud)

现在,所有其他的代码将使用myhttpwrapper的myGet,myPost方法代替$http的GET,POST方法.希望它有意义!

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

谢谢.

Flo*_*ian 15

对于您描述的具体情况,我建议不要包装$http.这样做并没有真正的好处.

这可以发挥作用的情况是你想要一个更"说"的API.假设你有User一个系统和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;
    }
  }
}]);
Run Code Online (Sandbox Code Playgroud)

这允许您使用呼叫参数.无论何时你必须改变路线,你都只有一个地方可以改变它们(如果你有十几个控制器发出$http请求,这将是非常糟糕的).

$resource如果您(也实际上有兼容的资源),您也可以使用此处.这里的决策因素应该是可读性,可重用性和以后易于更改.

所以,如果你只是在那里进行这些调用并且路由永远不会改变,那么继续$http直接使用,而不使用包装器.在增长的应用程序中,我认为这不太可能.