2014-10-10 51 views
0

AngularJoob here。我正在构建一个需要每秒轮询一次url的应用程序,并持久地存储这些数据,因为它需要被多个视图/控制器访问。AngularJS - 投入持久数据存储

我所做的处理是将我的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(); 
}); 

lastLapInfo(),这是导致错误,因为是阵列中没有数据的HTTP请求之前获取调用。有什么想法吗?

此外 - 如果我通常会遇到错误的方式来满足我的使用案例(例如,我应该使用别的东西而不是工厂)让我知道!

+0

做的东西在成功回调中,当你真正拥有数据时。 – dandavis 2014-10-10 22:04:18

回答

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. 
    }); 
}); 
+0

非常酷!扩展这个我将如何去设置这个http请求来轮询每一秒?只能认为我能想到,就是在工厂中有另一个功能,例如update(),并使用工厂在每个控制器的特定时间间隔调用该函数。有没有更好的办法? – darudude 2014-10-10 22:18:25

+0

您可以使用$ interval服务重复加载服务中的加载方法。这在这里进一步解释:http://stackoverflow.com/questions/14944936/angularjs-global-http-polling-service?answertab=votes#tab-top这里的例子http://plnkr.co/edit/iMmhXTYweN4IrRrrpvMq ?p =预览。 – bengro 2014-10-10 22:38:45

+0

谢谢!这是我需要的 – darudude 2014-10-14 00:10:56

1

如果你没有数据立即,无论是在返回值,表明它(nullundefined[]),或return a promise,这样你们还希望存储和以后获取数据后处理解决与原来。

因此,像

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来自评论。

+1

是的。我建议OP看看AngularJS $ q https://docs.angularjs.org/api/ng/service/$q – Rasmus 2014-10-10 22:06:03