【问题标题】:AngularJS - polling into persistent data storeAngularJS - 轮询持久数据存储
【发布时间】:2014-10-11 06:08:56
【问题描述】:

这里有角菜鸟。我正在构建一个需要每秒轮询一个 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();
});

lastLapInfo() 在导致错误的 http 请求之前被调用,因为数组中没有数据。有什么想法吗?

另外 - 如果我通常采用错误的方式来满足我的用例(例如,我应该使用其他东西而不是工厂),请告诉我!

【问题讨论】:

  • 当您实际拥有数据时,在成功回调中执行该操作。

标签: javascript angularjs http polling


【解决方案1】:

这是 promise 或 Angular 的 $q service 的典型用例。

以下方法,使用返回承诺的工厂:

App.factory('metrics', function($http){
   var service;
   ...
   service.load = function () {
      return $http.get('data.csv');
   });
   return service;
});       

然后在控制器中调用你的指标服务,然后你就可以使用 promise:

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

【讨论】:

  • 非常酷!扩展这个我将如何设置该http请求每秒轮询一次?只是认为我可以考虑一下,就是在工厂中有另一个函数,例如 update() ,并从我的每个控制器使用工厂以特定间隔调用该函数。有没有更好的办法?
  • 您可以使用 $interval 服务在您的服务中重复加载加载方法。此处对此进行了进一步解释:stackoverflow.com/questions/14944936/… 此处以 plnkr.co/edit/iMmhXTYweN4IrRrrpvMq?p=preview 为例。
  • 谢谢!这就是我需要的
【解决方案2】:

如果您没有立即获得数据,则可以通过在返回值(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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2013-06-30
  • 2012-06-15
  • 2011-12-15
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多