为什么我们在Angularjs中使用工厂/服务进行ajax调用?

为什么我们在Angularjs中使用工厂/服务进行ajax调用?,angularjs,angular-http,angular-controller,angular-factory,Angularjs,Angular Http,Angular Controller,Angular Factory,我被告知,我们使用工厂/服务来消除重复编码。下面是代码的一部分,它运行良好 app.controller('ServicesCtrl',['$scope','DataFactory',function($scope,$http,DataFactory){ DataFactory.GetData('services1.json') .then(function(response){ $scope.returnedData = response.data;

我被告知,我们使用工厂/服务来消除重复编码。下面是代码的一部分,它运行良好

app.controller('ServicesCtrl',['$scope','DataFactory',function($scope,$http,DataFactory){

    DataFactory.GetData('services1.json')
      .then(function(response){
         $scope.returnedData = response.data;
    })
      .catch(function(response){
        console.log('Error in process',response.status,response.data);
    });
  }]);

app.controller('ContactCtrl',['$scope','DataFactory', function($scope,DataFactory){

    DataFactory.GetData('location.json')
      .then(function(response){
         $scope.returnedData = response.data;
    })
      .catch(function(response){
        console.log('Error in process',response.status,response.data);
    });
  }]);

app.factory('DataFactory',['$http',function($http){

  var factory = {};

  factory.GetData = function(path) {
    return $http.get(path);

  }
  return factory;
}]);

我的问题是1。当我们必须在控制器内部实现承诺时,为什么要使用服务/工厂来进行这样的ajax调用?我的意思是,我必须做同样的。然后和。在两个控制器中捕捉呼叫。它的效率在哪里?有没有更好的办法?还是我做错了?是否有可能在工厂内履行这些承诺,并将响应数据返回给不同的控制器

这里的问题是代码的可重用性。现在假设您有一个名为

angular.module('test')
  .service('testService', function ($http) {

    this.getBidsUser = function ($username) {
      var endpoint = "bids/users/"+$username;

      return $http({
        method: 'get',
        url: endpoint
      });
    };

}
返回用户的出价。您可能希望在不同的视图中使用相同的信息。所以使用服务是一个好主意,这样您就不必再次重写相同的代码

同样,为了便于维护,您可能希望在同一服务上拥有所有相同的端点相关服务

若不使用服务模式,您可能需要更改服务的端点,这将非常繁忙


承诺arr回电。如果您在服务中处理这些承诺,那么维护调用方时间表将不容易

嗨,我们使用工厂和服务

  • 为了使应用程序更加模块化
  • 为了能够重用代码
  • 隐藏实现细节的步骤
例如,一个进行http调用的服务可能被视为一个高级“服务”,它返回所需的对象,独立于调用类型,并且在高级可重用

该服务允许自定义调用参数,可能避免调用控制器指定其中一些参数。或者它可以做一些预处理或后处理,它可以做一些缓存等等。而且它是便携式的,所以你可以在每次需要的时候给它打电话

最后一个问题

有没有可能在工厂里兑现这些承诺 是否将response.data返回到不同的控制器

也许这是可能的,但实现起来可能很复杂,因为它与响应的时间有关。相反,我建议您使用模块ngResource中的$resource服务,它已经可以满足您的需求

见文件:


可以将承诺缓存在服务中。否则,JavaScript是单线程的。函数只能返回立即可用的数据,或返回在将来某个时间解决、履行或拒绝的挂起承诺。