如何防止请求重复?

时间:2016-03-07 21:23:56

标签: javascript angularjs performance

我有两个视图使用的一个控制器 CounterpartyCtrl

第一个视图包含一个选择器,它需要收集所有记录。所以我获取所有对象并将它们放入 $ scope.counterparties

     app.controller('CounterpartyCtrl', [
      '$scope', 'Counterparty', function($scope, Counterparty) {},
        $scope.counterparties = {},

        $scope.loadCounterparties = function() {
          Counterparty.query(function(response) {});
          $scope.counterparties = response;
        },

        $scope.loadCounterparties();

     ]);

第二个视图必须仅包含按组划分的交易对手。

  $scope.customers
  $scope.vendors
  $scope.others
  $scope.HRs

因此,使用相同的控制器,我会像下面的

一样获取它们
 app.controller('CounterpartyCtrl', [
  '$scope', 'Counterparty', function($scope, Counterparty) {},
    $scope.counterparties = {},

    $scope.loadCounterparties = function() {
      Counterparty.query(function(response) {});
      $scope.counterparties = response;

      $scope.customers = Counterparty.query({
        group: 'Customer'
      });

      $scope.vendors = Counterparty.query({
        group: 'Vendor'
      });

      $scope.others = Counterparty.query({
        group: 'Other'
      });

      $scope.HRs = Counterparty.query({
        group: 'HR'
      });
    },

    $scope.loadCounterparties();

 ]);

正如您在此处看到的那样,明显重复请求。在每一个观点上,我都提出了相同的要求,因此这不是很有成效我该如何重构代码?

2 个答案:

答案 0 :(得分:1)

您可以更改后端以返回此类内容

{
    'Customers': customers,
    'Vendors': vendors,
    'Other': others,
    'HR': hrs
}

然后使用它来制作一个完整的数组,或者只是根据你调用时获取所需的部分。只有在所有用户都可以访问所有数据的情况下才能执行此操作,如果他们查看网络选项卡中的响应数据,则可以。它还会为您的前端提供更多的工作,以便客户端进行处理。

希望这有助于你所寻找的东西。

答案 1 :(得分:1)

这就是我在使用$ q和缓存服务中的结果以避免多个请求时的意思:http://plnkr.co/edit/3AeOjHaVo8MrY18tStEs

app.factory("dataService", ["$http","$q", function($http, $q){
    var counterParties;
    return {
        query: function(param){
             if(!counterParties){
                counterParties = $q.defer();
                $http.get("requestURL").then(function(response){
                    counterParties.resolve(response.data);
                });
             }
            return counterParties.promise;
        }
    };
}]);