为什么我们在 Angularjs 中对 ajax 调用使用 Factories/Services?
Why do we use Factories/Services for ajax calls in Angularjs?
我被告知我们使用 factories/services 来消除重复编码。这是工作正常的代码的一部分。
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. 当我们必须处理控制器内部的承诺时,为什么要使用 services/factories 进行这样的 ajax 调用?我的意思是,我必须在这里的两个控制器中进行相同的 .then 和 .catch 调用。它的效率在哪里?有没有更好的方法来做到这一点?还是我做错了?是否可以在工厂内实现这些承诺,并 return response.data 到不同的控制器?
这里的重点是代码的可重用性。现在假设您有一个名为
的服务
angular.module('test')
.service('testService', function ($http) {
this.getBidsUser = function ($username) {
var endpoint = "bids/users/"+$username;
return $http({
method: 'get',
url: endpoint
});
};
}
哪个 returns 位用户出价。您可能希望在不同的视图中使用相同的信息。所以使用服务是个好主意,这样您就不必再次重写相同的代码。
为了可维护性,您可能希望在同一服务上拥有所有与端点相关的服务。
您可能需要更改服务的端点,如果您不使用服务模式,这将很忙。
承诺 arr 回调。如果您在服务内处理这些承诺,则维护调用者时间线将不容易。
嗨,我们使用工厂和服务
- 使应用程序更加模块化,
- 有可能重用代码,
- 隐藏实现细节
例如,进行 http 调用的服务可能被视为高级 "service",它返回所需的对象,独立于调用类型,并且可在高级重用。
该服务允许自定义调用参数,可能会避免其中一些参数由调用控制器指定。或者它可以做一些预处理或者post处理,它可以做一些缓存等等。而且它是便携式的,因此您可以在需要时随时调用它。
关于你的最后一个问题
Is it possible to to work on those promises inside the factories and
return the response.data to different controllers?
也许可行,但实施起来可能很复杂,因为它与响应时间有关。相反,我建议您使用模块 ngResource 中的 $resource 服务,它已经可以满足您的需求。
查看文档:
我被告知我们使用 factories/services 来消除重复编码。这是工作正常的代码的一部分。
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. 当我们必须处理控制器内部的承诺时,为什么要使用 services/factories 进行这样的 ajax 调用?我的意思是,我必须在这里的两个控制器中进行相同的 .then 和 .catch 调用。它的效率在哪里?有没有更好的方法来做到这一点?还是我做错了?是否可以在工厂内实现这些承诺,并 return response.data 到不同的控制器?
这里的重点是代码的可重用性。现在假设您有一个名为
的服务angular.module('test')
.service('testService', function ($http) {
this.getBidsUser = function ($username) {
var endpoint = "bids/users/"+$username;
return $http({
method: 'get',
url: endpoint
});
};
}
哪个 returns 位用户出价。您可能希望在不同的视图中使用相同的信息。所以使用服务是个好主意,这样您就不必再次重写相同的代码。
为了可维护性,您可能希望在同一服务上拥有所有与端点相关的服务。
您可能需要更改服务的端点,如果您不使用服务模式,这将很忙。
承诺 arr 回调。如果您在服务内处理这些承诺,则维护调用者时间线将不容易。
嗨,我们使用工厂和服务
- 使应用程序更加模块化,
- 有可能重用代码,
- 隐藏实现细节
例如,进行 http 调用的服务可能被视为高级 "service",它返回所需的对象,独立于调用类型,并且可在高级重用。
该服务允许自定义调用参数,可能会避免其中一些参数由调用控制器指定。或者它可以做一些预处理或者post处理,它可以做一些缓存等等。而且它是便携式的,因此您可以在需要时随时调用它。
关于你的最后一个问题
Is it possible to to work on those promises inside the factories and return the response.data to different controllers?
也许可行,但实施起来可能很复杂,因为它与响应时间有关。相反,我建议您使用模块 ngResource 中的 $resource 服务,它已经可以满足您的需求。
查看文档: