2013-10-21 145 views
3

我想獲得MotorRestangular.all('Motors').getList()分配給變量a的響應,以便稍後使用它。問題是,如果我嘗試在return函數中訪問a,則它是未定義的。我知道這不是完成我所需要的正確方法,但我不知道如何以任何其他方式做到這一點。從Angular Promise獲取數據

myApp.factory('Configurations', function(Restangular, MotorRestangular) { 
    var a; 
    var Motors = function() { 
    MotorRestangular.all('Motors').getList().then(function(Motors){ 
     a = Motors; 
    }); 
    } 



    return { 
    config: function(){ 
     Motors(); 
     console.log(a); 
     var g = _.groupBy(Motors, 'configuration'); 
     console.log(g); 
     var mapped = _.map(g, function(m) { 
     return { 

      id: m[0].configuration, 
      configuration: m[0].configuration, 
      sizes: _.map(m, function(a) {return a.sizeMm}) 
     }}); 
    } 
    } 

}); 

回答

5

請不要使用延緩對象。如果你在你的答案有工作 - 那麼這將工作太:

myApp.factory('Configurations', function (Restangular, MotorRestangular, $q) { 
    var getConfigurations = function() { 
     return MotorRestangular.all('Motors').getList().then(function (Motors) { 
      //Group by Cofig 
      var g = _.groupBy(Motors, 'configuration'); 
      //Map values 
      return _.map(g, function (m) { 
       return { 
        id: m[0].configuration, 
        configuration: m[0].configuration, 
        sizes: _.map(m, function (a) { 
         return a.sizeMm 
        }) 
       } 
      }); 
     }); 
    }; 

    return { 
     config: getConfigurations() 
    } 

}); 

此外,如果發生錯誤,則返回的承諾不剩永遠懸而未決。

+0

完美的工作!謝謝。 – MattAitchison

1

我剛剛解決了這個問題。發生了什麼事情是config:a被填充之前返回。下面的代碼工作。

myApp.factory('Configurations', function(Restangular, MotorRestangular, $q) { 
    var getConfigurations = function(){ 
    var deferred = $q.defer(); 

    MotorRestangular.all('Motors').getList().then(function(Motors){ 
     //Group by Cofig 
     var g = _.groupBy(Motors, 'configuration'); 
     //Map values 
     var mapped = _.map(g, function(m) { 
     return { 
      id: m[0].configuration, 
      configuration: m[0].configuration, 
      sizes: _.map(m, function(a) {return a.sizeMm}) 
     }}); 
     deferred.resolve(mapped); 
    }); 
    return deferred.promise; 
    }; 

    return { 
    config: getConfigurations() 
    } 

});