1

我已经使用 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调用成功回调时被实例化。

该解决方案对我来说似乎很简洁,而且效果很好,但是在服务中实例化工厂有些东西对我来说并不点击。

4

0 回答 0