等待$ http.get调用完成

时间:2015-02-09 17:54:14

标签: angularjs angular-promise

我知道这与承诺有关,但我很难理解如何实施承诺。

我的控制器:

angular.module('landingApp')
  .controller('MainCtrl', function($http, $q){
    var main = this;

    main.favoritesIds = [];

    $http.get('api/v1/planograms/get_favorites')
      .success(function(data){
        for(var i=0; i < data.planograms.length; i++)
          main.favoritesIds.push(data.planograms[i].id);
      });

    main.isFavorite = function(planogram_id){
      return main.favoriteIds.indexOf(planogram_id) > -1;
    };

然后在我的模板中我使用isFavorite():

<div class="col-md-6" ng-repeat="planogram in main.planograms">
  <i class="fa fa-star fa-2x favorite" ng-class="{'yellow' : main.isFavorite(planogram.id)}">

所以基本上我希望所有标有“最爱”的平面图的星形图标变为黄色。但是main.isFavorite()返回未定义的我猜测因为$ http.get方法尚未解决。所以我的问题是如何在这种情况下实施承诺?

1 个答案:

答案 0 :(得分:2)

首先,由于isFavorite函数中存在拼写错误,因此无法正常工作:它不是main.favoriteIds,而是main.favoritesIds

其次,无论承诺如何,都应该有效。你是正确的,在返回$http调用之前,main.favoritesIds为空,但是当它被填充时,数组将被填充,而isFavorite函数(由Angular监视)是重新评价。

虽然你的代码在拼写错误修复后会起作用,但它并不是最佳的。观看的功能在每个摘要周期调用,应该非常快,而isFavorite执行isIndexOf,其复杂度为O(n)。

创建一个对象,而不是创建favoritesIds数组,这样就可以进行O(1)查找。或者,更好的是,用最喜欢的数据扩充planograms数组。

例如,favoritesIds作为对象:

 $http.get('api/v1/planograms/get_favorites')
    .success(function(data){
        for(var i=0; i < data.planograms.length; i++) {
          main.favoritesIds[data.planograms[i].id] = true;
        }
    });

 main.isFavorite = function(planogram_id){
   return main.favoritesIds[planogram_id];
 };