我以前也有类似的代码,但由于某些原因,这一块不是。这是一个简单的想法;调用函数,它调用基于$http的工厂来获取数据并返回该数据的数组。首先是工厂:

app.factory('getSensors', ['data', function (data) {
  return { get : function() {
      data.get('sensors').then(function (results) {
        var sensors = [];

        for(var i = 0; i < results.sensors.length; i++) {
          sensors.push({
            'id'        : Number(results.sensors[i][0]),
            'name'      : results.sensors[i][1],
            'type'      : results.sensors[i][2],
            'device'    : results.sensors[i][3],
            'unit'      : results.sensors[i][4],
            'parent'    : Number(results.sensors[i][5]),
            'latitude'  : Number(results.sensors[i][6]),
            'longitude' : Number(results.sensors[i][7])
          });
        }

        return sensors;
      });
    }
  };
}]);

它使用以下data服务:
app.factory('data', ['$http', function ($http) {
  var serviceBase = '/api/';
  var obj = {};

  obj.get = function (q) {
    return $http.get(serviceBase + q).then(function (results) {
      return results.data;
    });
  };

  return obj;
}]);

打给工厂的电话,我试过了getSensorsgetSensors.getgetSensors.get(),尽管我知道有些是错误的。我还尝试过不将此代码包装到函数中,使用在返回上面定义的函数,并在没有对象的情况下返回数组(它在我的其他函数中的工作方式,尽管我认为这不是最佳实践,但更简单)。我甚至把for循环换成了forEach
基本上,从getSensors工厂返回的值总是在我使用控制台调试完成$http调用之前发生,即使代码在回调函数中并且在该循环之后。在花了2个小时看了它并重写了这段代码之后,我对这是如何可能的感到茫然。我可能只是遗漏了一些明显的东西,或者是违反了角度的某些方面。

最佳答案

您缺少的关键部分是return您的.then()方法中的getSensors.get()创建的承诺:

app.factory('getSensors', ['data', function (data) {
  return { get : function() {
      return data.get('sensors').then(function (results) {
        var sensors = [];

        /* for loop (same as before) goes here */

        return sensors;
      });
    }
  };
}]);

然后要使用它,只需将getSensors服务作为依赖项注入,然后调用
getSensors.get().then(function (sensors) {
    /* do something with sensors array */
});

10-01 21:24