我以前也有类似的代码,但由于某些原因,这一块不是。这是一个简单的想法;调用函数,它调用基于$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;
}]);
打给工厂的电话,我试过了
getSensors
、getSensors.get
和getSensors.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 */
});