2014-10-10 81 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