我已经使用 Angular.js 有一段时间了,但我偶然发现了一段代码,这是一位以前的开发人员在我正在从事的项目中编写的,我想知道它的用法是否正确,或者我们是否应该将调用重构为任何内容最好的做法是。
该应用程序非常简单:它是一个 REST API 使用者,它对来自 API 的一些资源提供基本的 CRUD 操作。问题是:API 不是严格的 REST;我的意思是,并非所有资源都可以作为独立对象获取并由应用程序直接使用,而是一些响应在其中包含嵌套对象,并且需要一些响应解析逻辑来适应应用程序使用的模型。端点可能返回的一个非常简化的示例可能是:
{
"products": [
{
"full_name": "Product 1",
"price": 20000,
"quote": {
"downpayment": 3000,
"interest_rate": 0.049,
},
"customer_elegibility": {
"status": "approved"
}
},
{
"full_name": "Product 2",
"price": 15000,
"quote": {
"downpayment": 3000,
"interest_rate": 0.059,
},
"customer_elegibility": {
"status": "rejected"
}
},
]
}
因此,我遇到的代码使用创建自定义承诺的端点,如下所示:
angular.module('quotes').service('quoteService',
['$q','$http', 'Product',
function($q, $http, Product){
var base_url = "https://my-example-api.com"
this.getProducts = function (user_id){
var deferred = $q.defer();
var endpoint = "/users/"+ user_id +"/products";
$http({
url: base_url + endpoint,
method: "GET"
}).success(function(data, status, headers, config) {
var products = [];
var prod;
for(var i = 0; i < data.products.length; i++){
prod = new Product(data.products[i]);
products.push(prod);
}
deferred.resolve(products);
}).error(function(data, status, headers, config) {
console.log("Could not load products. Status: " + status);
deferred.reject(data);
});
return deferred.promise;
};
}]);
在这里,产品“对象”实际上是由以下工厂的链创建的:
angular.module('models').factory('Product',
['$q','$http', 'Quote', 'Elegibility',
function($q, $http, Quote, Elegibility){
var Product = function(data){
this.name = data.full_name;
this.elegibility = new Elegibility(data.customer_elegibility);
this.quote = new Quote(data.quote);
};
return Product;
}]);
angular.module('models').factory('Quote',
['$q','$http', function($q, $http){
var Quote = function(data) {
this.downpayment = data.downpayment;
this.interest_rate = data.interest_rate;
};
return Quote;
}]);
angular.module('models').factory('Elegibility',
['$q','$http', function($q, $http){
var Elegibility = function(data) {
this.status = data.status;
};
return Elegibility;
}]);
通过创建自定义承诺$q.defer();
是必要的,因为我们需要将 API 的响应转换为前端可以理解和使用的对象。让我有点困惑的是工厂内部的 JSON 解析逻辑封装,该工厂在$http
调用成功回调时被实例化。
该解决方案对我来说似乎很简洁,而且效果很好,但是在服务中实例化工厂有些东西对我来说并不点击。