为什么要将$ http调用移动到服务中?

Pro*_*ofK 7 javascript angularjs

目前我在三个控制器上都有这样的电话:

$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.");
            });
};
Run Code Online (Sandbox Code Playgroud)

我看到很多建议将$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.");
            });
};
Run Code Online (Sandbox Code Playgroud)

我可以为每个服务器端控制器创建一个RestService,但这最终只能调用核心服务并传递URL.

Jam*_*ton 2

有几个原因可以解释为什么它是重要应用程序中的良好实践。

使用单个通用服务并传入 url 和参数并不会增加您注意到的那么多价值。相反,您需要为每种类型的提取提供一种方法。

使用服务的一些好处:

  • 可重用性。在一个简单的应用程序中,每个控制器可能有一次数据获取。但这种情况很快就会改变。例如,您可能有一个包含 getProducts 的产品列表页面和一个包含 getProductDetail 的详细信息页面。但随后您想要添加销售页面、类别页面或在详细信息页面上显示相关产品。这些可能都使用原始的 getProducts (带有适当的参数)。
  • 测试。您希望能够独立于外部数据源来测试控制器。将数据获取烘焙到控制器中并不那么容易。对于服务,您只需模拟该服务,然后就可以使用稳定的已知数据来测试控制器。
  • 可维护性。您可能会决定,对于简单的服务,只需将其全部放入控制器中即可使用类似数量的代码,即使您正在重用它。如果后端路径改变会发生什么?现在您需要在使用它的所有地方进行更新。如果需要一些额外的逻辑来处理数据,或者您需要通过另一个调用获取一些补充数据,会发生什么情况?通过服务,您可以在一处进行更改。将其融入控制器后,您还有更多工作要做。
  • 代码清晰。您希望您的方法能够完成清晰、具体的事情。控制器负责应用程序特定部分的逻辑。添加获取数据的机制会让人感到困惑。通过一个简单的例子,您唯一需要的额外逻辑就是解码 json。如果您的后端以完全正确的格式返回控制器所需的数据,那还不错,但情况可能并非如此。通过将代码拆分出来,每个方法都可以做好一件事。让服务获取数据并将其以正确的格式传递给控制器​​,然后让控制器完成它的工作。