从Angular Promise获取数据

时间:2013-10-21 01:56:42

标签: javascript angularjs promise restangular

我正在尝试将MotorRestangular.all('Motors').getList()的响应分配给变量a,以便稍后使用。问题是,如果我尝试访问a函数中的return,则它是未定义的。我知道这不是完成我需要的正确方法,但我不知道如何做到这一点。

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})
      }});
    }
  }

});

2 个答案:

答案 0 :(得分:6)

请不要使用延迟对象。如果你在your answer中所做的工作 - 那么这也会有效:

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()
    }

});

此外,如果发生错误,则返回的承诺不会永久保留。

答案 1 :(得分: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()
  }

});