2015-11-13 92 views
0

我的角度是新的,也许我不明白有关承诺的一切,所以...... 我有一个资源工厂角未定义的承诺

.factory('Product',["$resource", function ($resource){ 
    var Resource = $resource(
     "/api/product/:product_id/", 
     {product_id: '@id'}, 
     { 
      query: { 
       isArray: true, 
       transformResponse: function (data) { 
        var items = angular.fromJson(data); 
        return items.results; 
       } 
      }, 
      update: { 
       method: "PUT", 
      } 
     }, 
     { 
      stripTrailingSlashes: false 
     } 
); 

而且我在其他工厂。

.factory('Get',["$http", "Product", function ($http, Product){ 
    return { 
     getDesc: function(id){ 
      var allProducts = Product.query(); 
      var products = []; 
      for (var i = 0; i < allProducts.length; i++){ 
       if(allProducts[i].desc == id){ 
        products.push(allProducts[i]); 
       } 
      } 
      return products; 
     } 
    } 
}]) 

在我的控制器

$scope.someClick = function(product){ 
     var products = Get.getDesc(product.id); 
     products.$promise.then(function(data){ 
      $log.log(data); 
     }); 
}; 

而且我得到了:错误:R $承诺是不确定的 我不知道为什么。你可以帮帮我吗?

回答

0

您的代码有几个问题。具体承诺如下: query方法返回一个包含$ promise的资源。因此您可以执行以下任一操作: 1.返回承诺并在控制器中执行处理,过滤(稍后详细介绍)。 2.使用。那么就承诺做过滤和返回承诺:

getDesc: function(id){ 
     var allProductsPromise = Product.query().$promise; 
     return allProductsPromise.then(function(response){ 
      var products = []; 
      for (var i = 0; i < response.length; i++){ 
       if(response[i].desc == id){ 
        products.push(response[i]); 
       } 
      } 
      return products; 
     }); 
    } 

其他问题,我看到的是双重过滤。由于你的查询需要一个ID,我假设你只有相关的产品。为什么你必须过滤结果(迭代和比较id)?如果我的观察是正确的,你可能不需要过滤块,你可以直接返回原始的承诺。

+0

谢谢你的回答。这个过滤将会更复杂。例如第一个模型具有另一个模型的foreignKey,并且我将通过此FK等进行过滤。如果我需要使用这些较早过滤的数据(产品)过滤此工厂中的其他数据,该怎么办? – Jeroj82

+0

基本上,承诺处理程序被链接和用作过滤器/变压器。第一个处理程序的返回值被传递给下一个处理程序,依此类推。这就是为什么在每个处理程序返回一个值很重要。 说了这样的话,你可以在处理程序中实现你的登录(在返回承诺之前)。 想想订购服务。您获得基本订单并且必须添加各种税收和成本: getPrice:function(){return Price.get()。then(addCommision).then(addTax).then(addInsurance); }。 下一个处理程序(.then(myHandler))将看到组合价格 – Meir