如何从服务中返回数据作为AngularJS中的承诺?

时间:2017-07-22 20:48:09

标签: javascript angularjs angular-promise angular-services

我正在尝试将服务中的数据作为承诺发送到我的控制器,但在尝试了一些选项后没有运气。 http服务默认返回一个promise,但我想将数据作为promise从一个控制器发送到另一个控制器。我的服务类看起来像:add函数用于设置来自另一个控制器的数据,get函数用于在另一个控制器中获取数据。

服务

    return {


      add : function(incategories){
      categories=incategories;
      console.log(subcategories)
    },

       addcatname:function(incat){
       category=incat
       console.log(category)
    },


      get : function(){
      return categories;
      console.log(category)
       },

       getcatname:function(){
        return category;
       },

从控制器获取数据的功能如下所示。

控制器

 vm.getSub=function(){
          vm.category=CategoryService.getcatname();
          vm.subcategories=CategoryService.get();
          vm.index = 0;
          vm.array1 = [];
          for(var i=0; i<vm.subcategories.length/2;i++)
          vm.array1.push(i);    
          return true;
 }

设置值的代码是:

vm.submit=function(category){
          subCategoryService.getsubCategories(category).then(function (response) 
         {
            console.log(response)
            CategoryService.addS(response.data.data.category_name);
            CategoryService.addsub(response.data.data.sunbcategories);


                                        })
            $location.path('/subcategory');    

}

我的HTML

<h1 class="header">{{'CATEGORY'|translate}}</h1><br>
<div ng-controller="CategoriesController as catCtrl" class="category-content">
    <table class="table-content" class="category-content" ng-show="catCtrl.getcategories()">
<tr ng-repeat="i in catCtrl.array"  ng-init="index = i*2">
    <td layout-align="space-around center" ng-repeat="category in catCtrl.categories.slice(index,index+2)" >


            <md-button md-whiteframe="6" ng-click="catCtrl.submit(category)" class="category-button"  aria-label="{{category}}">
               <div class="category-button-text-translation">{{category|uppercase| translate}}</div>
                <img ng-src="assets/images/categories/{{category}}.png" alt="{{category}}">
                <div class="category-button-text-english">{{category|lowercase}}</div>
            </md-button>
            <span flex></span>
     </td>
</tr>
    </table>
</div>

来自subCategoryService.getsubCategories(类别)的数据来自$ http服务,在获取该数据后,我正在设置服务中的值,以便另一个控制器可以访问它们。

现在我希望函数的前两行接收来自服务的承诺数据。我怎样才能做到这一点?以前,每次我获取数据都来自$ http服务,所以我没有问题,但我现在有点迷失了。谢谢!

1 个答案:

答案 0 :(得分:1)

如果要将get和getcatname设为自定义承诺,则必须使用 $ q 服务。为了做到这一点,请在您的服务上注入 $ q 服务,并使用如下

  getcatname:function(){
      //$q please inject $q on your service
       ̶l̶e̶t̶ ̶d̶e̶f̶e̶r̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶

         ̶d̶e̶f̶e̶r̶.̶r̶e̶s̶o̶l̶v̶e̶(̶c̶a̶t̶e̶g̶o̶r̶y̶;̶)̶
      return ̶d̶e̶f̶e̶r̶.̶p̶r̶o̶m̶i̶s̶e̶;̶ $q.resolve(category);
    }

在控制器中,您可以使用promise回调

获取此类别
CategoryService.getcatname.then(function(response){

vm.category=response;
});

https://docs.angularjs.org/api/ng/service/$q