Angular noob在这里。我正构建一个需要每秒轮询一个url的应用程序,并持久存储该数据,因为它需要被多个视图/控制器访问。
我已经完成的工作是将我的http请求放入工厂,并通过工厂中的功能将数据提供给控制器。我现在遇到的问题是在http请求之前调用了工厂函数,导致我的应用程序出错。
以下是代码:
App.factory('metrics', function($http){
var service;
var users = [{laps:[]}];
var updateMetrics = function(){
//updates the users array in the factory
};
$http.get('data.csv').success(function(data) {
var temp_array = data.split(" ");
updateMetrics(0, temp_array);
});
service.lastLapInfo = function(){
var lastlap = [];
for (var i=0; i<users.length;i++)
{
var lap = users[i].laps[users[i].laps.length-1];
lastlap.push(lap);
}
return lastlap;
};
return service;
});
App.controller('mainController', function($scope, $http, metrics) {
$scope.users=metrics.lastLapInfo();
});
在http请求之前调用lastLapInfo(),因为数组中没有数据导致错误。有什么想法吗?
此外 - 如果我通常以错误的方式来满足我的使用案例(例如我应该使用别的东西而不是工厂)让我知道!
答案 0 :(得分:2)
这是承诺或角度$q service的典型用例。
以下方法使用返回承诺的工厂:
App.factory('metrics', function($http){
var service;
...
service.load = function () {
return $http.get('data.csv');
});
return service;
});
在控制器中,您可以调用指标服务,并使用承诺:
App.controller('mainController', function($scope, $http, metrics) {
metrics.load().then(function(response) {
// at this point you know for sure that the request has terminated
// you can call the service again to run lastLapInfo or do the logic in here.
});
});
答案 1 :(得分:1)
如果您没有立即获得数据,请通过在返回值(null
,undefined
,[]
)或{{3}中指明数据来处理数据。相反,您最初也会在最初获取数据后存储和解析。
类似
var deferred = null;
$http.get(...).then ({
if (deferred) {
deferred.resolve(result);
deferred = null;
}
});
service.lastLapInfo = function(){
if (no metrics) {
deferred = $q.defer()
return deferred;
}
else {
return metrics;
}
};
应该有效,具体取决于你想要如何构建它。
修改:从评论中链接$q
。