使用Factory解析服务中的REST API响应

时间:2017-02-20 17:35:04

标签: angularjs rest angular-promise angular-services angular-factory

我一直在使用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;
    };
}]);

这里,产品&#34;对象&#34;实际上是由以下工厂的链条创建的:

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调用的成功回调中实例化。

解决方案看起来很整洁,而且效果很好,但是有一些关于在服务中实例化工厂的东西,它不会为我点击。

0 个答案:

没有答案