AngularJS - 轮询到持久数据存储

时间:2014-10-10 21:56:34

标签: javascript angularjs http polling

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(),因为数组中没有数据导致错误。有什么想法吗?

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

2 个答案:

答案 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)

如果您没有立即获得数据,请通过在返回值(nullundefined[])或{{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